是否有任何推荐的代码生成意味着适合替代C宏?

时间:2012-08-10 06:31:37

标签: c clang code-generation c-preprocessor

我刚刚开始研究大型遗留代码库。它有很多变量和结构,用纯文本"定义文件"命名。然后一些头文件将包含这些定义文件,并使用 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 ; }

有时这些预处理器生成的函数或数据会与函数指针交错,使其更加疯狂。

5 个答案:

答案 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语言(顺便说一句,如果你发现定义文件包含在宏的其他定义的其他位置)我会不会感到惊讶,因为其他东西会增加你的依赖关系构建过程尚未出现。

我不会这样做。这不是坏事或坏事,只是你不熟悉这种技术。

如果我对大型遗留代码的体验适用,那么你应该有很多机会来改进无可争议的破坏事物;这些工作。