2013年11月26日火曜日

C++からCの関数を呼び出す

普段あまり気にしていないのですが、
C++のソースから単にCの関数を呼び出すとリンク時に
"undefined reference to"なエラーが出てしまいます。
この辺り大昔にオブジェクト指向を学習していたときに
関数名がそのままシンボルにならないことは知ったのですが、
不覚にも気づくのに時間がかかってしまいました。
そう、目に見えているものがすべてではないんですよね。

解決方法は簡単でCで書かれたfunc()関数をC++から呼び出すのに
extern void func(void);

void main(void)
{
    func();
}
などとしているのを
extern "C" {
extern void func(void);
}

void main(void)
{
    func();
}
に修正するだけです。
よくヘッダファイルの先頭に
#ifdef __cplusplus
extern "C" {
#endif
が、最後に
#ifdef __cplusplus
}
#endif
なんていうおまじないがありますが、まさにこのためにあるんですね。

0 件のコメント:

コメントを投稿