c ++代码中的#if语句

时间:2016-08-09 09:26:16

标签: c++ macros

我正在使用第三方库,我没有编译他们的来源,只包括来自/usr/include的标题。

我知道源代码包含如下所示的块:

#if VAL1 && VAL2
    do something
#else
   do something I dont want to do
#endif

我知道VAL2设置为1,但VAL1设置为0,位于内部的其他文件中。

我要做的是自己定义VAL1,方法是复制将VAL1设置为0的标题内容,并自行设置值。

这是否会使库存代码运行时会进入第一个块?还是在编译时完全静止?

4 个答案:

答案 0 :(得分:4)

预处理器宏是编译时的东西。您通常使用它们来确保编译器知道在某些情况下如何表现。例如,当您为不同的平台使用不同的库时。

更多信息here

答案 1 :(得分:4)

  

这是否会使库存代码运行时会进入第一个块?还是在编译时完全静止?

答案是:在编译时它是完全静态的。

如果您想编译代码的两个版本,那么根据使用此if/def宏的上下文,您可以:

if (VAL1 && VAL2)
{    do something }
else
{   do something I dont want to do }

然后假设VAL1VAL2解析为1,代码do something将编译并执行,但代码do something I dont want to do将仅编译 - 但编译器将优化它不包含在生成的可执行文件中。

答案 2 :(得分:3)

简短回答:

这些是预处理程序指令,它们(如名称所示)在编译之前进行了预处理。一旦你的程序被编译;你不能再改变这种行为了。

答案 3 :(得分:2)

不,这只会影响在下次编译运行期间解析的标题。它对您已链接的库的已编译部分没有影响。

这意味着这可能是一个坏主意。通常,您希望保持编译器标志一致,并且包括宏。我们无法判断它是否会在这里产生影响,但除非你确定,否则我会坚持使用相同的宏定义。

如果这意味着您必须重新编译库本身,那么您就必须这样做。