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