next up previous
Next: 変数宣言と初期化 Up: ススンデルCとしてのC++ Previous: ススンデルCとしてのC++

関数の多重定義

C++とCとの違いの1つが,関数の多重定義だ.例として, 整数や実数に1を足すような(非常に単純な)関数を考えてみよう. Cなら,こんな風に書くところだ.

int add1_int(int x)
{
    return x+1;
}

double add1_double(double x)
{
    return x+1;
}
add1_intadd1_doubleは引数の型が違うので,別な関数名 にしなくてはならない.これに対して,C++では引数の型も関数名の 一部とみなされる.そのため,
int add1(int x)
{
    return x+1;
}

double add1(double x)
{
    return x+1;
}
という記述が可能だ.add1()という関数の引数としてintを与えれば 1番目の関数が呼ばれ,doubleを与えれば2番目の関数が呼ばれる というわけだ.ただし,引数の型が同じで返値だけが違うような多重定義 は許されていない.例えば,
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と呼ぶ. gif

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);
}


Akinori ITO
Thu Aug 7 15:05:13 JST 1997