トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
C++
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索

___

■ extern 'C' Linkage


  目的
    C++ から C のコードを呼び出すときに使う。

    c のコードがある    
    void cfunc() {

    }
c++ 側のコードからよびだす。 リンクする場合に次のエラーが表示される
    cl /c  main.cpp

    main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl cfunc(void)" (?cfuc@@YAXXZ) が関数 _main で参照されました。
    main.exe : fatal error LNK1120: 外部参照 1 が未解決です。
POINT コンパイラが生成する外部リンケージ名は, 実際のコード内の関数名とは異なる。 これは C++ のオーバーロードや呼び出し規約を名前に含ませるため。
    void cfunc();

    // C++ コンパイラが生成する名前は
    ?cfunc@@YAXXZ
C 言語の呼び出し規約では, 関数名の頭に _ がついた名前になる。
    _cfunc
そのため C++ 側でかいた cfunc() は リンク時に ?cfunc@@YAXXZ を探しにいくが C 側では _cfunc という名前で公開されているためリンクエラーとなる。 そこで C++ 側で関数を呼ぶ時に _cfunc() という名前で呼ぶようにコンパイラに指示する。
    extern "C" void cfunc();
通常は C で書いているモジュールを提供する側がこの処理をいれる。 C++ コンパイラでは __cplusplus プリプロセッサシンボルが自動で定義される。 これを利用してヘッダに以下の記述をすると, C++ 側では extern "C" cfunc() として公開される。
    // mod_c.h

    #ifdef __cplusplus
    extern "C"{
    #endif

    void cfunc();

    #ifdef __cplusplus
    }
    #endif
    #include "mod_c.h"

    {
      // _cfunc() という外部リンケージ名でコールするようにコンパイラがコードを生成する。
      cfunc();
    }
アセンブラを出力すると外部リンケージ名が見れる。
    // cl /c /FA  main.cpp

    call  _cfunc
    call  ?cfunc@@YAXXZ        ; cfunc
Cpp での関数名の名前の変換を許すか、許さないかをコンパイラに指示 C 言語で記述された Program と Link するよ と C++ コンパイラに教える。 cpp compiler に対して関数の改名を抑止
    // 関数の先頭で宣言する
    extern "C" void foo( void );
1. VarGbl, VarStatic は常駐する. -> plugin load 後は常に値をもって常駐している点に注意 理由: C で書かれた関数をC++ から呼び出すことが困難になるから。 既にあるC のライブラリを勝手に変形されては、呼び出しようがない printf -> xxx_printf() となってしまう。 extern "C" void Cfunc(int); extern "C"{ void Cfunc1(int); void Cfunc2(int); void Cfunc3(int); }
___

■ member 関数ポインタの扱い

WARNING ref VS.80.aspx

NINJAIDX 12