多通C预处理器

时间:2011-02-27 22:26:12

标签: c-preprocessor project-management

C 预处理器多次应用于相同的代码库(特别是按顺序执行两次?)是否可以远程理解?

例如,声明如下:

##define DECLARE(FILE) # define DECLARATIONS \
                       #   include FILE \
                       # undef DECLARATIONS
你以前见过这样的成语吗?如果是这样,代码库是什么?你能链接吗?编译一个像这样的项目的项目会遵循什么样的模式?可以按原样使CPP执行此操作,还是需要编写元预处理器以在处理双哈希声明时“隐藏”单哈希声明,依此类推?

3 个答案:

答案 0 :(得分:5)

我认为当您需要多次CPP传递时,您可能需要考虑m4或其他一些复杂的宏系统/代码生成器。我认为很难做到你想要的,因为无论如何你都要改变你的构建过程,看看其他模板或宏系统。

答案 1 :(得分:2)

哇,哇,你为什么要这样做?我相信GCC可以通过一些聪明的制作技巧(使用GCC的-E标志)强制做这样的事情,但我无法想象任何人能够在以后维护它。

答案 2 :(得分:1)

谷歌把它扔了,所以这是一个为期四年的用例,用于多个(预)编译通行证。

我可以看到多次传递编译的最大好处来自可选的预处理文件。具体来说,当人们希望看到预处理的源而不包括顶部的非常大的标准头。如,

#ifdef PRECOMPILATION
#ifdef TMPINCLUDE
#error "This stunt assumes TMPINCLUDE isn't already defined"
#endif
#define TMPINCLUDE #include <stdlib.h>
TMPINCLUDE
#undef TMPINCLUDE
#else
#include <stdlib.h>
#endif

这将在没有PRECOMPILATION的情况下正常编译,但如果编译为gcc -E -P -DPRECOMPILATION或类似的,将转换为包含所有代码的源文件,后扩展和顶部的#include语句。所以它仍然是有效的代码,也可以从已经预处理的文件中编译。

宏在C和C ++世界中不受欢迎。我想向更广阔的世界发布一个看似有用的库,但它非常基于宏来减少代码重复。使用一个或两个通过编译模型意味着我可以在我自己的工作中直接使用库,宏和所有,但也可以发布一个仅使用预处理器来包含标准库的清理版本。

这是否是远程理智是相当主观的。