【发布时间】:2019-09-04 06:34:48
【问题描述】:
我正在使用标准 CPP 来预处理任何 C/CPP 文件。 我正在使用以下命令进行预处理:
cpp -idirafter <path_to_header_files> -imacros <sourcefile> <source_file> > <destination_file>
上面的命令正在用头文件中定义的相应实现替换所有宏。
如果我想要一些包含特定字符串(例如,ASSERT)的特定宏不应该被 cpp 预处理器替换。即,如果某些头文件中定义的名称为 TC_ASSERT_EQ 或 TC_ASSERT_NEQ 的宏不应该被预处理器替换。
有什么方法可以控制吗?
【问题讨论】:
-
确定宏没有定义?如果它们是在您无法控制的头文件中定义的,这可能会很困难。
-
先用一些没用过的名字替换掉再替换回来?
-
如果您创建一个“编译时定义”并使用 -D 将其传递给编译器而不是预编译器会怎样。可以说
gcc -DPERMIT_ASSERTS。然后用这个你可以屏蔽掉所有你想保护的宏定义,在头文件和源文件中都使用#if defined作为测试。 -
在运行之前使用搜索和替换 - 这样 ASSERT 变为 ASSERT__donotsub 等 - 然后在完成后替换回来(如果你有半长列表,你可以使用正则表达式)。这对您来说是一个可行的解决方案吗?
-
你试过
#undef吗?
标签: c++ gcc macros c-preprocessor preprocessor-directive