コンパイラの警告 (レベル 1) C4743
'type' のサイズは、'file1' と 'file2' で異なります: size_1 バイトと size_2 バイト
2 つのファイルで参照または定義された外部変数は、それらのファイル間で型が異なります。file1 における変数のサイズが file2 における変数のサイズと異なるとコンパイラが判断しました。
解説
C++ でこの警告を生成できる重要なケースがあります。 2 つの異なるファイルで同じ名前のクラス型を宣言する場合(これらの宣言に仮想関数が含まれている場合)、宣言が同じでない場合、コンパイラは仮想関数テーブルに対して警告 C4744 を出力できます。 この警告は、同じ型に対して 2 つの異なるサイズの仮想関数テーブルがあり、リンカーが実行可能ファイルに組み込むためにいずれかを選択する必要があるために発生します。 プログラムが間違った仮想関数を呼び出す可能性があります。
この警告を解決するには、同じ型定義を使用するか、それらの型または変数にそれぞれ異なる名前を使用します。
例
次の例では C4743 が生成されます。 コンパイルするには、両方のファイルを同じフォルダーに配置し、開発者コマンド プロンプトで次のコマンドを実行します。
cl /EHsc /W1 /GL /O2 C4743a.cpp C4743b.cpp
ソース ファイル C4743a.cpp
:
// C4743a.cpp
class C {
public:
virtual void f1(void);
virtual void f2(void);
virtual void f3(void);
};
void C::f1(void) {}
void C::f2(void) {}
void C::f3(void) {}
C q;
ソース ファイル C4743b.cpp
:
// C4743b.cpp
class C {
public:
virtual void f1(void);
virtual void f2(void);
virtual void f3(void);
virtual void f4(void);
virtual void f5(void);
};
void C::f4(void) {}
void C::f5(void) {}
C x;
int main() {}
この問題を解決するには、 C
クラスの 1 つの名前を変更します。