C++とCとの違いの1つが,関数の多重定義だ.例として, 整数や実数に1を足すような(非常に単純な)関数を考えてみよう. Cなら,こんな風に書くところだ.
int add1_int(int x) { return x+1; } double add1_double(double x) { return x+1; }
add1_int
とadd1_double
は引数の型が違うので,別な関数名
にしなくてはならない.これに対して,C++では引数の型も関数名の
一部とみなされる.そのため,
という記述が可能だ.add1()という関数の引数としてintを与えれば 1番目の関数が呼ばれ,doubleを与えれば2番目の関数が呼ばれる というわけだ.ただし,引数の型が同じで返値だけが違うような多重定義 は許されていない.例えば,int add1(int x) { return x+1; } double add1(double x) { return x+1; }
のようなことはできないというわけだ.int add1(int x) { return x+1; } double add1(int x) { return (double)(x+1); }
内部的には,関数名が引数の型名を含むようなラベル名に変換されている.
例えば,上記の関数add1(int), add1(double)の場合,例えば
add1__i_i
,add1__d_d
のようなラベル名に変換されてコンパイルされる.
これによって,分割コンパイルの際に,正しい関数を呼び出すことが可能に
なる.これを``type safe linkage''とよび,int add1(int)のような
関数名をadd1__i_i
のように変換することをmanglingと呼ぶ.
manglingがあるため,C++からはCの関数をそのまま呼び出すことが
できない.例えばCで上記のint add1_int(int)
を記述し,
それをC++から呼び出そうとした場合,C++の方では,int add1_int(int)
のラベルをadd1_int__i_i
だと思ってしまうためである.
これを防ぐため,Cで書かれた関数の宣言がC++には用意されている.
これは,次のようにする.
extern "C" { int add1_int(int); }