3

コンパイラ:MS VS 2010

以下の私のプログラムでは、A_arrayをexternとして宣言し(コンパイラにどこかで定義されることを伝えます)、A.cppで定義しています。

ただし、リンカーエラーが発生します。A.cppは正常にコンパイルされましたが、これはA_arrayにメモリが割り当てられ、存在している必要があることを意味します。この問題の原因は何ですか?

注:SOでリンカーエラーコードを検索しましたが、このエラーの正確な理由を見つけることができませんでした。

A.h
----------------------
#ifndef INC_A_H
#define INC_A_H
extern const int A_array[];
#endif
----------------------

A.cpp
----------------------
const int A_array[] = {10, 20, 30};
----------------------

B.cpp
----------------------
#include <iostream>
#include "A.h"

int main()
{
    for(int i=0; i<3; i++)
    {
        std::cout << A_array[i] <<"\n";
    }
    int x;
    std::cin >> x;
    return 0;
}
----------------------

出力:

1>ClCompile:
1>  B.cpp
1>  A.cpp
1>  Generating Code...
1>B.obj : error LNK2001: unresolved external symbol "int const * const A_array" (?A_array@@3QBHB)
1>Visual Studio 2010\Projects\test_extern\Debug\test_extern.exe : fatal error LNK1120: 1 unresolved externals

更新-1:

A.cppにAhを含めると、コードがコンパイルされ、リンクされ、正常に動作します。誰かがこれがA.cppに含まれる必要がある理由を説明できますか?

4

1 に答える 1

4

問題は、ヘッダー ファイルに (少し間違った) 前方宣言があることです。

の型const int A_array[] = {10, 20, 30};は配列または長さ 3 です。

の型const int A_array[]intポインタまたは未定義の長さの配列です (配列の長さはまだわかりません)。

これらの定義は正確には一致しないため、 にインクルードA.hしない限り、コンパイラはそれらが同じであることを認識しません。これはA.cpp、定義と宣言の両方が同じファイルにあり、コンパイラがそれらをリンクするためです。

で宣言をA.h extern const int A_array[3]行うとうまくいくはずです。A.hに含めるA.cpp方がより正確ですが。

于 2013-02-14T10:54:36.490 に答える