3

我有以下两个文件

//###########
//a.cpp
//###########
#include <iostream>

int main()
{
    extern int var; //Why is this allowed?
    std::cout << var << std::endl;
    var = 99; //Core dump happens here
    std::cout << var << std::endl;
    return 0;
}

//###########
//b.cpp
//###########
extern const int var = 41;

在这里,编译和链接没有任何问题。当我运行时,我在尝试将“var”的值设置为 99 时得到核心转储。我想知道为什么允许我在 a.cpp 中声明一个非常量 var。链接器不应该无法链接吗?

4

1 回答 1

1

从技术上讲,根据 C++ 标准,您的程序是“不正确的”。我不确定它最终是否会赌“未定义的行为”或“你不应该这样做,这是错误的”的其他分类。

但是,编译器很难为链接器传达足够的信息来发现这种类型的错误,因为链接器并不真正理解“你在做什么”(例如,写入 aconst无效,但链接器没有了解这些操作是一个写操作——它只知道“你想要var这里的地址)。

由于您本质上是在对编译器撒谎,因此您是在对自己做这件事。C 和 C++ 充满了你必须对编译器保持诚实的情况,否则事情可能会出现可怕的错误,但编译器并不总是能帮助你发现这些事情(通常是因为很难以可靠的方式实现)。

于 2013-07-16T13:32:17.490 回答