C++ 预处理器#if语句的工具/解析器?

C++ 预处理器#if语句的工具/解析器?,c++,c,parsing,preprocessor,C++,C,Parsing,Preprocessor,我正在处理许多C源代码文件,其中包含许多预处理器#if、#elseif和#else语句 此语句通常检查#define,例如 #if(Switch_TestMode == Switch_TestModeON) /* code 1 */ #else /*code 2 */ #endif 这个预处理器语句通常位于c-if语句中,这使得源代码对于人类来说几乎不可读 如果在额外文件中定义了语句,则用于此预处理器的#定义语句 我现在的想法是使用一个工具来检查这个#defined开关设置,然后只复制使用当前

我正在处理许多C源代码文件,其中包含许多预处理器
#if
#elseif
#else
语句

此语句通常检查
#define
,例如

#if(Switch_TestMode == Switch_TestModeON)
/* code 1 */
#else
/*code 2 */
#endif
这个预处理器语句通常位于c-if语句中,这使得源代码对于人类来说几乎不可读

如果在额外文件中定义了语句,则用于此预处理器的#定义语句

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

对于上面的例子,我想得到一个新的.c文件,它只包含

/*code 2 */
假设
开关测试模式
定义
不等于
开关测试模式

是否有可用的工具(免费| |低成本)来完成这项工作? 或者我必须为此编写自己的预处理器解析器吗

(我不可能使用一个特殊的参数来运行编译器,因为我们公司正在创建C源代码,另一家公司正在编译。)

谢谢你的提示

问候


Thomas

您可以使用命令行选项-E运行GNU编译器来进行预处理

试试看


编辑:现在已成为

您可以使用unifdef。

unifdef可从中获得。

这不完全是OP要求的,因为这也会导致评估其他预处理指令和宏调用。OP说,“使用当前的#定义/切换设置应用的源代码行”。如果他指的是部分集,他本可以这么说。同意,如果Sunifdef只想删除一些条件,那么他的回答会更好。需要考虑/探索的事情很少:如果您的客户报告编译错误行号,那么很难将它们映射回原始源。预处理器通常在其输出中放置一些标记,以便编译器可以提供有用的行号,但我不知道这在编译器之间是标准化的,因此您可能无法为您的客户端编译器适当地标记输出。此工具具有非常好的编码样式和极其简单的编译(没有自动生成,只是一个简单的生成文件,也是Windows上Visual Studio的解决方案)。它的简单性让我着迷。。。