#author("2026-01-11T11:47:49+09:00","","")
#author("2026-01-11T11:48:20+09:00","","")
#topicpath

//////////////////////////////////////////////////////////////////////////////
* 目次 [#sb289273]
#contents();


//////////////////////////////////////////////////////////////////////////////
* extern "C" について [#ea3f607f]
- C++ から C で書かれた関数を呼ぶ際、又は C から C++ で書かれた関数を呼ぶ際、呼ばれる側で宣言する

//////////////////////////////////////////////////////////////////////////////
* extern "C" する際の注意点 [#r43bfa4b]
//============================================================================
** extern "C" すると、引数の型の一致が検査されない [#re958f19]

//============================================================================
** C++ の関数は例外を C 関数側に漏らしてはならない [#ddba36d1]
- C++ 関数が throw した例外が C 関数側に到達した場合の動作は、C++の規格上は未定義で、GCC ではプロセスが異常終了する
//----------------------------------------------------------------------------
*** C++ が例外を throw するケースには、以下も含まれる [#pbc87264]
- new 演算子が std::bad_alloc 例外を throw する
- std::vector のメンバ関数 at が std::out_of_range 例外を throw する


//----------------------------------------------------------------------------
*** 例外を C 側に漏らさない為に [#r40cfd24]
- 以下のように、C++関数全体を try/catch でくくっておくのも一つの手
 extern "C" {
 int func() try
 {
     // 例外を throw するような処理
     return 0;
 } catch (...) {
     return 1;
 }
 } // extern "C"

//============================================================================
** 関数ポインタが使われる場合 [#n0586e6c]
- C++ から C関数へ関数ポインタを渡す場合、C関数に関数ポインタで渡されたC++関数が例外を throw した場合、C関数内を C++ 例外が通過してしまう
//----------------------------------------------------------------------------
*** 例外を C 側に漏らさない為に [#q593de25]
- このようなケースで例外の throw を抑止するには、コンパイル時に ''-fexceptions'' を指定する

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS