我感到奇怪的是,通过启用优化功能,某些代码会“编译”,否则不会“编译”。在这里,我的意思是(通过“编译”)经历编译的所有阶段并创建一个可执行文件(即包括链接)。考虑以下代码:
struct A { static constexpr int i{0}; };
int main() {
const int *p = &A::i;
return *p;
}
此代码完全可以被g ++ -std = c ++ 14 -O1接受,但是如果我传递-O0,则链接器会抱怨缺少符号(正如我预期的那样)。我可以看到优化器如何告诉它不需要那些符号,但是让我感到奇怪的是,一个实际上失败了,而另一个成功了。这是编译器的故意行为吗?它是某种“设计技术”吗?是否有可能“强迫”编译器不发出这些符号(例如,对于嵌入式环境)?
任何见识都会受到赞赏。
我正在使用gcc 7.3.0