我习惯使用具有大量#ifdef
,#if
和#endif
指令的 C 代码,这些代码会保留一些部分处于活动状态而某些部分处于非活动状态,具体取决于某些变量是否定义。我搜索了可以处理它们以生成最终 C 代码的内容。但预处理对#include
和#define
也是如此。但我想保留它们。
那么,有什么东西可以通过一些过滤来预处理这些文件或项目吗?
答案 0 :(得分:2)
有一系列程序可以做到这一点:
我在一些非常扭曲的代码上广泛使用了sunifdef,并且从来没有发现它犯了错误。我现在已经准备好开始使用coan,尽管它仍然会受到一段时间的审查。版本4.2.2于今天发布,2010-12-20。
另请参阅:SO 525283
答案 1 :(得分:0)
我假设你正在使用gcc。
如果您指的是所有#include
,我认为您需要将其删除,请使用gcc -E
展开生成的文件,然后再添加#includes
。
如果您只是标准标题,则选项-nostdinc
可以帮助您按照自己的意愿
user@host:~/test/tmp$ cat 4437465.c #include <stdio.h> #ifndef OUTPUT_TYPE #define OUTPUT_TYPE 1 #endif int main(void) { #if OUTPUT_TYPE == 1 printf("output type 1\n"); #elif OUTPUT_TYPE == 2 printf("output type 2\n"); #else printf("default output type\n"); #endif return 0; }
user@host:~/test/tmp$ gcc -DOUTPUT_TYPE=2 -nostdinc -E 4437465.c # 1 "4437465.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "4437465.c" 4437465.c:1:19: error: no include path in which to search for stdio.h int main(void) { printf("output type 2\n"); return 0; }
答案 2 :(得分:0)
你想要的可能实际上是一个坏主意,因为可能存在来自包含文件的定义,例如描述你的体系结构......但是任何现代IDE都可以显示#if预处理器指令。
答案 3 :(得分:0)
我们使用自定义解析器来实现您的目标。 Lex & YACC 这将是一个良好的开端。
另外,在大型代码库中管理不同版本的二进制文件是一种非常痛苦的方法。如果可能的话,尝试将您的可选代码部分隔离在不同的库中,这些库可以或不能作为动态或静态库包含在最终交付物中。