能否在现有C++程序中插入并执行外部生成的C++代码?
需求实现方案说明
你的需求完全可以实现,C++生态下有两类成熟的实现路径,可根据你的实际场景选择:
方案1:编译期整合(优先推荐,性能最高、实现最简单)
C++是编译型语言,只要你生成代码的步骤可以放在主程序编译之前执行,选这个方案即可:
- 先调整生成的代码结构,把它改成可被主程序引用的头文件/源文件,示例如下:
// 将生成文件重命名为generated_code.h,添加头文件保护和必要的引用 #pragma once #include "FirstClass.h" #include "SecondClass.h" inline std::pair<FirstClass, SecondClass> build_generated_objects() { FirstClass first = FirstClass(); first.add(*some data1*); first.add(*some data2*); // ... 其余生成的first.add逻辑 SecondClass second = SecondClass(); second.add(*some data1*); // ... 其余生成的second.add逻辑 return {std::move(first), std::move(second)}; } - 主程序直接引用该头文件调用即可,修改后的主程序逻辑:
#include "generated_code.h" int main() { auto [first, second] = build_generated_objects(); MyClass obj = MyClass(); obj.use(first, second); } - 最后在构建脚本(Makefile/CMake/VS生成事件等)里加自定义步骤,先执行你的代码生成程序,再编译主程序,整个流程可以完全自动化。
方案2:运行时动态执行(仅适合代码需要在主程序启动后才生成的场景)
如果你的C++代码是主程序运行过程中才动态生成的,无法提前参与编译,可以用动态加载的方式实现:
- 执行步骤:
- 主程序生成代码后,调用系统内置的C++编译器,把生成的代码编译为对应平台的动态链接库(Windows下是
.dll,Linux下是.so,Mac下是.dylib),编译时需要保证头文件路径、依赖库和主程序完全一致,同时要在生成的代码里导出获取first、second对象的接口。 - 主程序调用系统原生的动态库加载接口(Windows下
LoadLibrary,Linux下dlopen)加载生成的动态库,拿到导出的函数指针后调用,即可拿到对应的first、second对象使用。
- 主程序生成代码后,调用系统内置的C++编译器,把生成的代码编译为对应平台的动态链接库(Windows下是
- 注意事项:
- 运行环境必须安装和主程序编译版本一致的C++编译器
- 需要额外处理代码编译错误、动态库加载失败等异常场景
- 运行时执行不可信的生成代码有安全风险,可能导致主程序崩溃
你示例中直接调用
do_cpp_code_from_file后就直接使用变量的写法无法直接实现:C++是静态强类型语言,所有变量的类型必须在编译期就确定,运行时动态生成的变量不能直接在主程序代码里引用,必须通过函数返回值、全局变量、指针等编译期可识别的载体传递。
内容的提问来源于stack exchange,提问作者maksonnie
相关产品推荐
相关产品推荐

