我刚刚开始研究大型遗留代码库。它有很多变量和结构,用纯文本"定义文件"命名。然后一些头文件将包含这些定义文件,并使用 C 预处理器生成变量声明和getter / setter。
这会导致工作和修改字段的巨大痛苦。此外,getter / setter的签名在编译时才生成,因此也没有智能感知支持。
我正在考虑在编译时生成代码并要求其他模块包含生成的头文件,而不是包含基于预处理器的头。我查看了Python + clang并将关键字添加到 C 语言中。但他们两个都是压倒性的,我不知道如何开始。所以我想问一下人们建议如何解决这个问题。
编辑: 代码库不属于我,所以我无法复制和粘贴。 但我可以模仿代码,它看起来像:
// in the definition file
NEWVARIABLE( point, int )
// in the preprocessor header file
#define NEWVARIABLE( name, type ) \
static type name;\
type LIBNAME_Get##name##(){return name ; }\
void LIBNAME_Set##name##( type _##name ){ name = _##name ; }
有时这些预处理器生成的函数或数据会与函数指针交错,使其更加疯狂。
答案 0 :(得分:2)
也许您可以运行预编译器(例如,使用GCC编译器gcc -E
),然后剪切并保存生成的文本。不是很好,但很难自动更好。
答案 1 :(得分:1)
如果你正在使用GCC,那么gcc -save-temps Code.c
。它将生成一个预处理的文件作为Code.i,所有的宏将在这里被替换。 (不确定你想要什么)
答案 2 :(得分:0)
没有明显需要在编译时生成函数名称。只有从程序中实际调用的函数才会链接到可执行文件中。所以你应该问问自己这些宏是否满足任何目的,然后考虑用所有可能的函数组合替换它们。 (如果程序对性能至关重要,也许是内联函数。)
但是,根据程序的大小和复杂程度,对现有程序进行过于剧烈的更改往往是一个坏主意。
如果有更详细的答案,你必须发布一些代码。
答案 3 :(得分:0)
如果您的兴趣范围包括商业解决方案,我建议您查看我们的网站http://www.cdsan.com。我们提供自定义重构和转换器。看起来可以合理地转换文件。
答案 4 :(得分:0)
我的理解是你想要替换一个标准的C语言(顺便说一句,如果你发现定义文件包含在宏的其他定义的其他位置)我会不会感到惊讶,因为其他东西会增加你的依赖关系构建过程尚未出现。
我不会这样做。这不是坏事或坏事,只是你不熟悉这种技术。
如果我对大型遗留代码的体验适用,那么你应该有很多机会来改进无可争议的破坏事物;这些工作。