スポンサーサイトC++からCの呼び出し

Home > ----- / スポンサー広告 > This Entry 2006-07 / CからC++へ > This Entry [com : 0][Tb : 1]

--------

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2006-07-13

C++の大きな特徴の一つとしてCとの互換性があり、また、Cの資産をそのまま再利用できるということがあります。実際、組み込み開発における既存資産やミドルウェアなどの大多数はCによるものですので、これらが利用できないとなるとかなり辛いわけですが、C++ではCの資産を簡単に有効利用するための機能が備わっています。

まず、C++からCの関数を呼び出す方法です。これはCで実装された関数を、C++側で宣言する際に extern "C" を付けることで可能になります。例えば、

extern "C" void func(void);

といった具合です。複数の関数を宣言する際は、ブロックを使って次のように記述することもできます。

extern "C" {
void func(void);
int foo(int);
int bar(const char*);
}

extern "C" というのは何かというと、言語結合を意味しています。この"C"の部分を"C++"とすれば、それがC++の外部識別子であることを表します。標準規格で保証される言語結合は"C"と"C++"だけですが、他にも"Ada"や"Fortran"といった指定が可能な処理系もあるわけです。

ところで、extern "C"を用いてC結合にした場合、C++結合とは何が異なるのでしょうか?厳密には処理系によるわけですが、C++の場合、(リンカが認識する)外部シンボルは、仮引数並びの情報が埋め込まれています。それに対してCでは仮引数並びの情報は外部シンボルに反映されません。結果として、C結合の場合には関数の多重定義を行うことができません。ただし、C結合の関数と、同名のC++結合の関数であれば多重定義は可能です。

関数の場合は、上で書いたようにC結合とC++結合の違いは明らかですが、オブジェクト(変数)については、多くの場合、C結合とC++結合の間で違いはありません。しかし、処理系によっては*1オブジェクトであっても外部シンボルに型情報を埋め込む場合があるので、オブジェクトの場合も extern "C" を付ける必要があります。

他にも些細な点として、CとC++の間の非互換性に注意する必要があります。例えば、(func()のように)関数の仮引数並びがない場合、Cでは実引数の型や個数をチェックしないことを意味しますが、C++ではvoidを指定したのと同じになります。他にも、C99にしかない型や修飾子などはC++では使えません。こうした微妙な非互換性に注意する必要があります。

また、Cには例外処理がありませんが、C++では関数に何も指定しなければあらゆる例外が送出される可能性があるため、その関数を呼び出す文脈次第では、サイズ・速度ともに効率が低下します。効率のことを考えるのであれば、Cで実装した関数をC++側で宣言する場合には、例外指定 throw() を付けておいた方がよいでしょう。


*1 Microsoft Visual C++は、オブジェクトの場合も外部シンボルに型情報が埋め込まれます。

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/93-690e6461

CからC++関数の呼び出し

C++からCの関数を呼び出す方法については「C++と組み込み環境」で書きましたので、こちらではその逆、すなわちCからC++の関数を呼び出す方法について書くことにします。 まず、Cから呼び出せる関数は、C++でいうところの「C結合」でなければなりません。具体的には、C++側 ...

今日の検索フレーズ : 2006-07-14 12:44

C++と組み込み環境 | Page Top▲

New >>
型識別
<< old
「今日の検索フレーズ」について
ブログ内検索
RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。