1

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

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

4

5 回答 5

2

也许您可以只运行预编译器(gcc -E例如使用 GCC 编译器),然后剪切并保存生成的文本。不是很好,但很难自动让它变得更好。

于 2012-08-10T06:37:49.960 回答
1

如果您使用的是 GCC,那么gcc -save-temps Code.c它将生成一个预处理文件作为 Code.i,并且所有宏都将在此处替换。(不确定你想要什么)

于 2012-08-10T06:40:07.720 回答
0

我的理解是,您想用其他会在您的构建过程中添加依赖项的东西替换标准的 C 习惯用法(顺便说一下,如果您在其他地方找到包含宏的其他定义的定义文件,我不会感到惊讶)还没有。

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

如果我对大型遗留代码的经验适用,那么您应该有很多机会来改进无可争议的问题;工作在那些。

于 2012-08-11T07:44:15.277 回答
0

如果您感兴趣的范围包括商业解决方案,我建议您查看我们的网站http://www.cdsan.com。我们提供自定义重构和转换器。看起来可以通过合理的努力转换您的文件。

于 2012-08-11T07:10:25.397 回答
0

没有明显的需要在编译时生成函数名。只有从程序中实际调用的函数才会链接到可执行文件中。所以你也许应该问问自己这些宏是否有任何用途,然后考虑用所有可能的函数组合替换它们。(如果程序对性能至关重要,则可能是内联函数。)

但是,根据程序的大小和复杂性,对现有程序进行过于剧烈的更改通常是一个坏主意。

对于比这更详细的答案,您将不得不发布一些代码。

于 2012-08-10T06:42:37.867 回答