通过 TinyCC 这个库,演示了如何用 C++ 编写并动态编译代码来计算 斐波那契数列。代码通过 递归方式 实现了斐波那契数列的计算,并且通过 TinyCC 库进行即时编译和执行的强大功能。

 

V1代码示例:

#NoEnv
SetBatchLines -1
SetWorkingDir %A_ScriptDir%
#SingleInstance Force

; C++ 源码【采用递归方式计算斐波那契数列】
; 跑这段代码只需要 lib文件夹 和 libtcc.dll
c =
(
int fn(int n) {
  if (n < 2)
    return n;
  return fn(n - 1) + fn(n - 2);
}
)

计时()

tcc := new TinyCC()
tcc.SetOutputType(1)  ; CONST.TCC_OUTPUT_MEMORY := 1 输出将在内存中运行(默认)
if (-1 = tcc.CompileString(c))
  throw Exception("Compile Error")
if (0 > tcc.Relocate(1))
  throw Exception("Relocate Error") 
if (0 = enum_pixel := tcc.GetSymbol("fn"))
  throw Exception("GetSymbol Error")

Rtn := DllCall(enum_pixel, "int", 35, "cdecl")

MsgBox % Rtn "`n耗时:" 计时() " 毫秒"
Return


计时() {
  Static
  if 开始=
    DllCall("QueryPerformanceFrequency", "Int64*", 频率), DllCall("QueryPerformanceCounter", "Int64*", 开始)
   else
    DllCall("QueryPerformanceCounter", "Int64*", 结束), 耗时:=(结束 - 开始)/频率*1000, 开始:=""
  Return 耗时
}

CONST.TCC_OUTPUT_MEMORY := 1,	   ; 输出将在内存中运行(默认)
CONST.TCC_OUTPUT_EXE := 2,      ; 可执行文件
CONST.TCC_OUTPUT_DLL := 3,      ; 动态库
CONST.TCC_OUTPUT_OBJ := 4,      ; 目标文件
CONST.TCC_OUTPUT_PREPROCESS := 5,   ; 仅预处理(内部使用);仅预处理(内部使用)
CONST.TCC_RELOCATE_AUTO := 1    ; 在内部分配和管理内存

class TinyCC {
  static LibTccPath := "libtcc.dll"

  ; 构造函数
  __New() {
    if !(this.LibTcc := DllCall("LoadLibraryW", "str", TinyCC.LibTccPath, "ptr"))
      throw Exception("LoadLibrary Error")
    if !(this.Ptr := DllCall("libtcc\tcc_new", "ptr"))
      throw Exception("Failed to create TCC compilation context")
  }

  ; 析构函数 
  __Delete() {
    if (this.Ptr)
      DllCall("libtcc\tcc_delete", "ptr", this.Ptr)
    if (this.LibTcc)
      DllCall("FreeLibrary", "ptr", this.LibTcc)
  }

  ; 设置库路径
  SetLibPath(path) {
    return DllCall("libtcc\tcc_set_lib_path", "ptr", this.Ptr, "astr", path)
  }

  ; 设置错误回调
  SetErrorFunc(errorOpaque, errorFunc) {
    return DllCall("libtcc\tcc_set_error_func", "ptr", this.Ptr, "ptr", errorOpaque, "ptr", errorFunc)
  }

  ; 设置选项
  SetOptions(str) {
    return DllCall("libtcc\tcc_set_options", "ptr", this.Ptr, "astr", str)
  }

  ; 添加包含路径
  AddIncludePath(pathname) {
    return DllCall("libtcc\tcc_add_include_path", "ptr", this.Ptr, "astr", pathname)
  }

  ; 添加系统包含路径
  AddSysIncludePath(pathname) {
    return DllCall("libtcc\tcc_add_sysinclude_path", "ptr", this.Ptr, "astr", pathname)
  }

  ; 定义预处理符号
  DefineSymbol(sym, value) {
    return DllCall("libtcc\tcc_define_symbol", "ptr", this.Ptr, "astr", sym, "astr", value)
  }

  ; 取消定义预处理符号
  UndefineSymbol(sym) {
    return DllCall("libtcc\tcc_undefine_symbol", "ptr", this.Ptr, "astr", sym)
  }

  ; 添加文件
  AddFile(filename) {
    return DllCall("libtcc\tcc_add_file", "ptr", this.Ptr, "astr", filename)
  }

  ; 编译字符串
  CompileString(buf) {
    return DllCall("libtcc\tcc_compile_string", "ptr", this.Ptr, "astr", buf)
  }

  ; 设置输出类型
  SetOutputType(outputType) {
    return DllCall("libtcc\tcc_set_output_type", "ptr", this.Ptr, "int", outputType)
  }

  ; 添加库路径
  AddLibraryPath(pathname) {
    return DllCall("libtcc\tcc_add_library_path", "ptr", this.Ptr, "astr", pathname)
  }

  ; 添加库
  AddLibrary(libraryname) {
    return DllCall("libtcc\tcc_add_library", "ptr", this.Ptr, "astr", libraryname)
  }

  ; 添加符号
  AddSymbol(name, val) {
    return DllCall("libtcc\tcc_add_symbol", "ptr", this.Ptr, "astr", name, "ptr", val)
  }

  ; 输出文件
  OutputFile(filename) {
    return DllCall("libtcc\tcc_output_file", "ptr", this.Ptr, "astr", filename)
  }

  ; 重定位
  Relocate(ptr) {
    return DllCall("libtcc\tcc_relocate", "ptr", this.Ptr, "ptr", ptr)
  }

  ; 获取符号
  GetSymbol(name) {
    return DllCall("libtcc\tcc_get_symbol", "ptr", this.Ptr, "astr", name, "ptr")
  }
}

 

打包文件下载:

蓝奏云:https://wwvw.lanzouu.com/itpS52ldj2kd 提取码:ahk6

123网盘:https://www.123865.com/s/ufi3Td-Wpr53 提取码:ahk6

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。