【发布时间】:2012-10-03 19:16:13
【问题描述】:
说我有一个函数
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
我可以毫无问题地编译和运行它;如果我想要这个功能,我可以通过-D FEATURE_X 并且它可以工作。
但是,如果我想将do_something 放入另一个文件中(并且每次我决定更改选项时都不必重新编译该文件)。如果它在同一个文件中,我假设
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
将正确使用死代码消除,消除调用。如果我把它放在另一个文件中,没有 LTO,
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
它不会删除代码(它无法知道)。那么,在启用链接时优化的情况下,编译器能否在链接时检测到FEATURE_X 的值,判断代码是否被使用,并在适当的时候将其移除?
【问题讨论】: