0

ソースファイル un2.cpp があるとします

----un2.cpp----

class employee;
void employee::setname(string s)
{
.....(some  code)
}

従業員クラスは setname() が宣言されている un2.h で定義されています。「cc -c un2.cpp -o un2.o」で un2.cpp をコンパイルしようとすると、エラー メッセージが表示される

 un2.cpp:3:16: error: invalid use of incomplete type ‘struct employee’
 un2.cpp:1:7: error: forward declaration of ‘struct employee’

コンパイラが単に従業員を外部シンボルとして取り (以前に宣言されたが未定義のシンボルを取るように)、 un2.cpp ファイルをコンパイルしないのはなぜですか。

通常の未定義シンボルと未定義クラスのコンパイルに違いはありますか? また、クラスを前方宣言し、その中のシンボルを定義する方法を教えてもらえますか?

4

3 に答える 3

3

externalはリンカ用であり、コンパイラは前方宣言を記述しただけではクラス宣言を認識しないため、コードをコンパイルするときに役立ちません。

代わりに、コンパイルするために、un2.cppファイルの宣言にヘッダーを含める必要があります。

于 2012-08-15T13:07:35.023 に答える
2

重要なのは、クラスはシンボルで表されないということですが、コード生成には完全なクラス構造がわかっている必要があります。まず、コンパイラはクラス定義を使用して、クラスにaを取得して返すという名前のメンバー関数が実際に含まれていることを確認する必要があります(employee含まれていない場合、コンパイラはエラーを返す必要があります)。さらに、関数内のクラスの他のメンバーにアクセスする(他のメンバー関数を呼び出す、またはデータメンバーにアクセスする)必要があるため、クラス定義の一部であるそれらの宣言が必要になります。リンケージ時に、クラス名は完全になくなります(デバッグ情報を除き、メンバー関数のシンボルおよび仮想テーブルの一部として)。setnamestringvoid

通常、ヘッダーの実装ファイルを作成するときは、実装ファイルにヘッダーファイルを含める必要があります。これにより、そこで宣言されたすべてを定義するために必要なすべてのものが揃っていることを確認できます。さらに、実装ファイルに最初にインクルードする場合は、ヘッダーファイルもテストします。

于 2012-08-15T13:13:16.883 に答える
2

クラスの宣言にファイルが含まれていません。クラスにそのようなメソッドが含まれているかどうかをコンパイラが認識できないため、ここでは前方宣言は役に立ちません。

ヘッダー ファイルを含めると、エラーは解消されます。

于 2012-08-15T13:10:54.910 に答える