私はこのリンクを読んでいましたC++で配列を使用するにはどうすればよいですか?、セクション5。配列を使用する際の一般的な落とし穴。例は次のとおりです。
// [numbers.cpp]
int numbers[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// [main.cpp]
extern int* numbers;
int main()
{}
numbers.cppの「numbers」は配列の名前であり、通常は「 &numbers [0] 」に等しいポインタに減衰する可能性があるため、main.cppでは「numbers」の値は「&numbers[0]」のままであると予想されます。 。しかし、違います!代わりに「numbers[0]」、つまり「1」です。
または、私がコンパイラであるとしましょう。「numbers.cpp」では、シンボル「numbers」が「1」を指すアドレスとして表示されます。なぜこの同じシンボルが「main.cpp」の値1に変更されるのですか?
私はそれが著者が「タイプ安全でないリンク」と言っていることを理解しています。しかし、コンパイラーがタイプミスマッチリンクエラーを発生させたとしても、コンパイラーがこれを行う理由はわかりません。
コメントコメント
私の理解では、コンパイラは以下を同等と見なしているので、リンカーは成功します。そうでない場合、「未解決の外部」エラーが発生します。
// [numbers.cpp]
int tmp[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //{1,..9} starts at global address 0x1234
int *numbers = &tmp[0]; //numbers == 0x1234
// [main.cpp]
extern int* numbers; //numbers == 0x1234
int main()
{}
実際の状況:
// [numbers.cpp]
int numbers[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //{1,..9} starts at global address 0x1234
// [main.cpp]
extern int* numbers; //numbers == numbers[0] == 1
int main()
{}