#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'' を指定する