考虑以下代码:
struct X {
static const int i = 45;
};
void foo() {
const int* k = &X::i;
}
int main() {
}
如果不打开您最喜欢的编译器,您认为尝试编译和链接这个简单的野兽会产生什么结果?
有些人可能会感到惊讶,它不仅取决于编译器,还取决于它的优化选项!例如,在 gcc 上,代码将拒绝在优化关闭的情况下链接,但会很乐意在任何优化打开的情况下链接(并生成可运行的无操作可执行文件)。
失败案例中的诊断会很有趣 -X::i
找不到符号。启用优化的链接会成功,因为X::i
会被丢弃。
和问题。编译此代码的编译器行为是否正确?由于X::i
没有链接,当被要求生成一个要求该符号链接的代码时,编译器不应该抱怨吗?