【问题标题】:Is there any recommend code generation mean that is suitable to substitute C macro?是否有任何推荐的代码生成方法适合替代 C 宏?
【发布时间】:2012-08-10 06:31:37
【问题描述】:

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

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

【问题讨论】:

  • 该代码使用 C 预处理器来预处理不是有效 C 代码的文件,以生成实际声明?显然,最初的设计师认为这是一个很大的优势。你错过了什么吗? (例如,只是修改非 C 文件来进行字段更改?)

标签: c clang code-generation c-preprocessor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        我的理解是,您想用其他会在您的尚不存在的构建过程。

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-01
            • 1970-01-01
            • 2011-01-20
            • 1970-01-01
            相关资源
            最近更新 更多