通过 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)