リンク:【ソース+水=麦茶色の何か】

Cの場合「シンボル名」はほぼ関数名と同じ。

が、c++では関数の所属する名前空間の情報や関数の引数の型情報がシンボルに含まれるようになった。

例えば、int hoge(int a) という関数がある場合、シンボル名は

 c → _hoge
 c++ → __Z4hogei

となる。(nmで確認できる)

その為、c++側で、xの関数を「extern "C"」を付けて宣言する必要がある。

 extern "C" void function();

または

extern "C" 
{
   void func1();
   void func2();
}

これにより、コンパイラはC++形式での名前修飾を行わなくなる。

ただし、extern "C"を使う場合、型のチェックが動かなくなるため、変な使い方をしていてもコンパイル出来てしまうという問題がある。

(実際には実行時にセグメンテーションフォルトで落ちる)

CでC++の関数を呼ぶ

基本的には出来ないが、extern "C" で宣言をしたc++ の関数ならば可能。

ただし、例外をCに渡してはならない。