BCC では大丈夫だったので、不完全な struct の宣言にも class を使う習慣になってしまっていたのですが、VC ではリンク時にエラーになります。
一つ目のモジュール
struct Foo { }; Foo* CreateFoo() { return new Foo; } void PrintFoo(const Foo&) { }
二つ目のモジュール
class Foo; // 問題の不完全な宣言 Foo* CreateFoo(); void PrintFoo(const Foo&); int main() { Foo* foo = CreateFoo(); PrintFoo(*foo); delete foo; }
コンパイルしてリンクするとエラー
error LNK2019: 未解決の外部シンボル "class Foo * __cdecl CreateFoo(void)" (?CreateFoo@@YAPAVFoo@@XZ) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "void __cdecl PrintFoo(class Foo const &)" (?PrintFoo@@YAXABVFoo@@@Z) が関数 _main で参照されました。
class と struct を入れ替えて(デフォルト コンストラクタとデストラクタも必要)エラーメッセージを見ると、マングル後が1文字違うのがわかります。
error LNK2019: 未解決の外部シンボル "struct Foo * __cdecl CreateFoo(void)" (?CreateFoo@@YAPAUFoo@@XZ) が関数 _main で参照されました。 error LNK2019: 未解決の外部シンボル "void __cdecl PrintFoo(struct Foo const &)" (?PrintFoo@@YAXABUFoo@@@Z) が関数 _main で参照されました。
class Foo が ...VFoo... で、struct Foo が ...UFoo... です。