ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

More Effective C++ 項目34 同じプログラム内でC++とCを混ぜる方法を理解する

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 More Effective C++ (AddisonーWesley professional co)

  • 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/06/29
  • メディア: 単行本(ソフトカバー)
  • 購入: 8人 クリック: 129回
  • この商品を含むブログ (43件) を見る

項目34 同じプログラム内でC++とCを混ぜる方法を理解する

名前マングリング、静的なものの初期化、動的メモリ割り当て、データ構造の互換性の4つについて。

名前マングリング(name mangling)

オーバロードで関数名が変わるため、extern "C"を使って名前マングリングを抑制する。
C++の関数も、他のプログラミング言語を通して使われるライブラリなどを書くため、extern "C"が使える。
名前マングルのアルゴリズムはコンパイラ依存。

静的なものの初期化

静的クラスオブジェクト、大域オブジェクト、名前空間オブジェクト、ファイルスコープオブジェクトのコンストラクタはmainが実行される前に呼ばれる。デストラクタはmainが実行を終えたときに呼ばれる。 システムの他の部分をC++で書いたのなら、mainもC++で書くべき。 CのmainをC++にするには名前を変えてC++でのmainからコールする。

extern "C"
int realMain(int argc, char *argv[]);

int main(int argc, char *argv[]) {
  return realMain(argc, argv);
}

mainがC++で書かれていないときの静的オブジェクトの初期化と破棄はほとんどのコンパイラで別のメカニズムが用意されているらしい。

動的メモリ割り当て

newで確保したらdelete、mallocで確保したらfree。strdup()内で確保されたものは?
Cライブラリから持ってきたのならfree、C++として書かれてものならおそらくdelete。
このような問題を回避するため、ほとんどのプラットフォームで安定して使える関数しか使わないようにするべき。

データ構造の互換性

CとC++のstructは、組込み型であればレイアウトが同じ。C++側のstructに非仮想関数があっても互換性はある。
仮想関数が加わるとメモリの割り当て方が変わって仮想関数ポインタ付きになる。
データをCとC++でやり取りするには、C++とCの両方でコンパイルが通るような構造体にする。