1

最初のヘッダー ファイル

   //status.h file
    static int A[2] = {1,2};

そして別のヘッダーファイル

//anotherfile.h file
#include "status.h"

int GETID()
{
  return A[1];
}

A が宣言されていない識別子であると言ってコンパイルすると、エラーが発生し続けます。A を extern const int として定義しようとしましたが、それでも役に立ちませんでした。私のIDE(VS2010)では、GETID()の下のA値にカーソルを合わせると、実際にAの内容を見ることができます。

私の実際のプログラムでは、 A は250個の要素を含む配列であり、プログラム内で複数の場所で宣言したくないため、 A をグローバル配列として使用したいと考えています。この場合、別のヘッダー ファイルで配列 A を利用するにはどうすればよいでしょうか?

編集: A は、GETID() がクラス関数であるどのクラスにも属していません。

4

2 に答える 2

3

名前空間スコープstaticはグローバルではなく、内部リンケージを持つ変数です。そのコピーは、ヘッダーを含む翻訳単位ごとに作成されます。次のように宣言externし、ヘッダーにインクルード ガードを使用する必要があります。

//status.h file
#ifndef STATUS_H
#define STATUS_H
extern int A[2];
#endif

//status.cpp
#include "status.h"
int A[2] = {1,2}

どこででも を使用Aできます#include "status.h"

2つの値しかないint A[2] = {1,2,3};と言っているが、3を与えているので、それは違法であることに注意してください.A

于 2012-11-12T22:12:22.413 に答える
1

セットアップに複数の問題があります。

まず、物事が本当にあなたの言うとおりであれば、コードからこのエラーが発生することはありません。あなたが投稿したコードは完全にコンパイル可能であり、「宣言されていない識別子」の問題はありません。実際にこのエラーが発生する理由は、ヘッダー ファイルが循環的に含まれているためです。直接的または間接的に、あなたは にstatus.hanotherfile.h同時にに含めることができanotherfile.hましたstatus.h。循環ヘッダーのインクルードは機能しません。グローバル配列で主な問題を解決したとしても、後で別の方法で頭をもたげるので、循環ヘッダーのインクルードを取り除く必要があります。

第 2 に、真にグローバルな配列、つまりプログラム全体からアクセスできる 1 つの配列が必要な場合は、 としてではなく、外部リンケージで宣言する必要がありますstaticstatic宣言は、翻訳単位ごとに 1 つずつ、無数の完全に独立した配列を生成します。

于 2012-11-12T22:41:23.820 に答える