[英]#if statements in c++ code
我正在使用第三方库,我没有编译他们的来源,只包括来自/usr/include
的头文件。
我知道源代码包含如下所示的块:
#if VAL1 && VAL2
do something
#else
do something I dont want to do
#endif
我知道VAL2
设置为1
,但VAL1
设置为0,位于内部某处的不同文件中。
我想要做的是自己定义VAL1
,通过复制将VAL1
设置为0
的标题的内容,并自己设置值。
这样做是为了当库的代码运行时,它会运行到第一个块吗? 或者在编译时它是完全静态的?
预处理器宏是编译时的东西。 您通常使用它们来确保编译器知道在某些情况下如何表现。 例如,当您为不同的平台使用不同的库时。
更多信息在这里
这样做是为了当库的代码运行时,它会运行到第一个块吗? 或者在编译时它是完全静态的?
答案是:它在编译时完全是静态的。
如果您想编译代码的两个版本,那么根据使用此if/def
宏的上下文,您可以:
if (VAL1 && VAL2)
{ do something }
else
{ do something I dont want to do }
然后假设VAL1
和VAL2
解析为1,代码do something
将编译并执行,但代码do something I dont want to do
只会编译 - 但编译器会通过不将其包含在生成的可执行文件中来优化它。
简短的回答: 没有
这些是预处理程序指令 ,在编译之前(如名称所示)预处理。 一旦你的程序被编译; 你不能再改变这种行为了。
不,这只会影响在下一次编译运行期间解析的标题。 它对您已链接的库的已编译部分没有任何影响。
这意味着它可能是一个坏主意。 通常,您希望保持编译器标志一致,并且包括宏。 我们无法判断它是否会在这里产生影响但是,除非你确定,否则我会坚持使用相同的宏定义。
如果这意味着您必须重新编译库本身,那么您就必须这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.