10

C++ に移植しなければならない C コードがいくつかあります。コードには構造があります

struct A { 
    ...
    struct A * myPtr;
}

そして、2 つのグローバル配列が宣言され、次のように初期化されます。

//Forward declaration of Unit
struct A Unit[10];

struct A* ptrUnit[2] = { Unit, Unit+7 };
struct A Unit[10] = { { .., &ptrUnit[0] }, 
                      ... };

これは C では正常に機能しますが、C++ ではエラーが発生します (変数が再宣言されます)。C++ で変数を前方宣言することはできませんか?

4

4 に答える 4

20

struct A Unit[10]変数の前方宣言ではありません。「前方宣言」という用語は通常、定義ではない宣言を指しますstruct A Unit[10]が、は定義です。したがって、コードUnitでは、同じソースファイルで複数回定義しています。C言語では、初期化子のないC定義では暫定的な定義であるため、これは許可されます。それらは同じ翻訳単位で何度も発生する可能性があります。C ++には、暫定的な定義などはありません。C ++では、複数の定義は常に違法です。

変数の真の前方宣言が必要な場合は、キーワードを使用する必要がありますextern

extern struct A Unit[10];

これは、CとC++の両方で機能します。ただし、副作用として、これによりUnit 外部リンケージが発生します。内部リンケージを持つ変数が必要な場合、C ++では運が悪いことになります。これは、C++では内部リンケージを持つ変数を前方宣言することができないためです。一方、Cの暫定的な定義では、それを達成するのに役立ちます。

于 2010-09-15T05:15:26.407 に答える
20

C++ では、変数宣言に接頭辞を付ける必要がありますextern

extern A Unit[10];

// ...

A Unit[10] = { ... };

(C++ では先頭の を省略できることに注意してくださいstruct。)

于 2010-09-15T05:07:21.083 に答える
1

Cを使用すると、変数を一時的に宣言できます(私は推測します)。C++はそうではありません。'Unit'が定義されると、同じスコープで再定義することはできません

于 2010-09-15T05:08:23.483 に答える