2010-11-03 81 views
7

我正在处理许多包含许多预处理器#if#elseif#else语句的C源代码文件。预处理器#if语句的工具/解析器?

该陈述通常检查#define,例如,

#if(Switch_TestMode == Switch_TestModeON) 
/* code 1 */ 
#else 
/*code 2 */ 
#endif 

通常这个预处理器语句位于c-if语句中,这使得人类的源代码几乎不可读。

用于此预处理程序#if语句的#define是在一个额外的文件中定义的。

我现在的想法是拥有一个工具来检查这个#define d开关设置,然后只复制使用当前#define /开关设置应用的源代码行。

对于上面的例子,我想获得其中只包含

/*code 2 */ 

假定Switch_TestMode#define一个新的.c文件不等于Switch_TestModeON

是否提供这项工作的工具(免费软件||低成本)? 或者我必须为此编写我自己的预处理器解析器吗?

(这是不可能的,我用它来完成这个工作的特殊参数运行编译器,因为我们的公司创造了C-源代码,另一家公司正在编制)。

感谢您的任何提示!

问候

托马斯

+0

很少有需要考虑/探索的事情:如果您的客户报告编译错误行号,他们会更难映射回您的原始资源。预处理器通常会在其输出中放入一些标记,以便编译器可以提供有用的行号,但是我不知道这在编译器之间是如何标准化的,所以您可能无法为客户的编译器适当地标记输出。 – 2010-11-04 02:05:45

回答

1

可以使用命令行选项-E做预处理运行GNU编译器。

http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

+1

这不正是OP所要求的,因为这也会导致其他预处理指令和宏调用被评估。 – 2010-11-03 23:05:58

+0

Op说,“使用当前#定义/开关设置应用的源代码行”。如果他的意思是分歧,他可以这么说。同意,如果Sunifdef只想删除某些条件,答案会更好。 – 2010-11-03 23:08:43

2

尝试Sunifdef

编辑:现在这已成为Coan

+0

sunifdef开发已经转移到Coan:http://coan2.sourceforge。net/ – 2010-11-03 23:19:47

1

您可以使用unifdef。

3

unifdef可从http://dotat.at/prog/unifdef/获得。

+0

这个工具有非常好的编码风格和非常简单的编译(没有automake,只是一个简单的makefile,也是Windows上的Visual Studio的解决方案)。它的简单让我着迷...... – akavel 2012-09-06 12:37:41