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

なんていうおまじないがありますが、まさにこのためにあるんですね。

広告