处理一些指令而留下其他指令

时间:2010-12-14 09:06:40

标签: c c-preprocessor

我习惯使用具有大量#ifdef#if#endif指令的 C 代码,这些代码会保留一些部分处于活动状态而某些部分处于非活动状态,具体取决于某些变量是否定义。我搜索了可以处理它们以生成最终 C 代码的内容。但预处理对#include#define也是如此。但我想保留它们。

那么,有什么东西可以通过一些过滤来预处理这些文件或项目吗?

4 个答案:

答案 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  这将是一个良好的开端。

另外,在大型代码库中管理不同版本的二进制文件是一种非常痛苦的方法。如果可能的话,尝试将您的可选代码部分隔离在不同的库中,这些库可以或不能作为动态或静态库包含在最终交付物中。