我正在使用第三方库,我没有编译他们的来源,只包括来自/usr/include
的标题。
我知道源代码包含如下所示的块:
#if VAL1 && VAL2
do something
#else
do something I dont want to do
#endif
我知道VAL2
设置为1
,但VAL1
设置为0,位于内部的其他文件中。
我要做的是自己定义VAL1
,方法是复制将VAL1
设置为0
的标题内容,并自行设置值。
这是否会使库存代码运行时会进入第一个块?还是在编译时完全静止?
答案 0 :(得分:4)
预处理器宏是编译时的东西。您通常使用它们来确保编译器知道在某些情况下如何表现。例如,当您为不同的平台使用不同的库时。
更多信息here
答案 1 :(得分:4)
这是否会使库存代码运行时会进入第一个块?还是在编译时完全静止?
答案是:在编译时它是完全静态的。
如果您想编译代码的两个版本,那么根据使用此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
将仅编译 - 但编译器将优化它不包含在生成的可执行文件中。
答案 2 :(得分:3)
简短回答:否
这些是预处理程序指令,它们(如名称所示)在编译之前进行了预处理。一旦你的程序被编译;你不能再改变这种行为了。
答案 3 :(得分:2)
不,这只会影响在下次编译运行期间解析的标题。它对您已链接的库的已编译部分没有影响。
这意味着这可能是一个坏主意。通常,您希望保持编译器标志一致,并且包括宏。我们无法判断它是否会在这里产生影响,但除非你确定,否则我会坚持使用相同的宏定义。
如果这意味着您必须重新编译库本身,那么您就必须这样做。