3

次の2つのファイルがあります

//###########
//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 で非 const var を宣言できる理由を知りたいです。リンカーはこれをリンクできませんか?

4

1 に答える 1

1

技術的には、C++ 標準によると、プログラムは「正しくありません」。「未定義の動作」または「実際にこれを行うべきではない、間違っている」という他の分類に賭けることになるかどうかはわかりません。

ただし、リンカーがこのタイプのエラーを見つけるのに十分な情報をコンパイラが伝えるのは困難です。これは、リンカーが「何をしているのか」を実際には理解していないためです (たとえば、a への書き込みconstは有効ではありませんが、リンカーは有効ではありません)。操作が書き込みであることを理解してください。「varここのアドレスが必要です」ということを知っているだけです。

あなたは本質的にコンパイラーに嘘をついているので、これを自分自身にやっています。C と C++ には、コンパイラに対して正直でいなければならない場合や、事態がひどくうまくいかない場合がたくさんありますが、コンパイラは常にこれらのことを見つけるのに役立つとは限りません (多くの場合、信頼できる方法で達成するのは難しいためです)。

于 2013-07-16T13:32:17.490 に答える