C言語なら、俺に聞け! lt;50gt;
■ このスレッドは過去ログ倉庫に格納されています
0245デフォルトの名無しさん
NGNG何で extern "C" が必要かを知らないクチかな?
オーバーロード、名前空間という C++ の機能を考えれば
分かると思うよん。
VC++ なら次のコードをビルドしてみれ。
void foo() { }
void foo(int) { }
namespace hoge { void foo(); }
extern "C" void foo(int, int) { }
void main() { foo(); foo(0); hoge::foo(); foo(0, 0); }
多分こんなリンクエラーが出ると思う。
Test.obj : error LNK2019: 未解決の外部シンボル _foo が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl hoge::foo(void)" (?foo@hoge@@YAXXZ) が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl foo(int)" (?foo@@YAXH@Z) が関数 _main で参照されました。
Test.obj : error LNK2019: 未解決の外部シンボル "void __cdecl foo(void)" (?foo@@YAXXZ) が関数 _main で参照されました。
オブジェクトファイルとかの中では実際には
extern "C" foo → _foo
hoge::foo() → ?foo@hoge@@YAXXZ
foo() → ?foo@@YAXXZ
foo(int) → ?foo@@YAXH@Z
とか名前が変わってるわけ。(変わり方はコンパイラ依存)
extern "C" のある時(Cを使った時)とそうじゃないときじゃ
全然名前の変わり方が違うっしょ?
C++ だと引数の型や名前空間の情報も名前に含めるの。
これが同じ名前の関数を複数定義できる仕組みでもあるわけだけど。
extern "C" を使わないで何とかするんじゃなくて、
extern "C" を使って何とかする方向で考えるべきだと思われ。
■ このスレッドは過去ログ倉庫に格納されています