9_関数リロード解析(下)

2026 ワード

キーワード:関数リロードとポインタ、externキーワード、CとC++相互呼び出し
1.リロードとポインタ
  • リロード関数名を関数ポインタに付与する場合
  • リロード規則に従って関数ポインタパラメータリストと一致する候補
  • を選択する.
  • 候補の関数タイプと関数ポインタの関数タイプを厳密に一致させる

  • プログラミング実験:関数リロードVS関数ポインタ
    #include 
    #include 
    
    int func(int i)
    {
        return i;
    }
    
    int func(int a, int b)
    {
        return a + b;
    }
    
    int func(const char* s)
    {
        return strlen(s);
    }
    
    typedef int(*PFUNC)(int a);
    
    int main(int argc, char* argv[])
    {
        int c = 0;
        
        PFUNC p = func;
    
        c = p(1);
    
        printf("%d
    ", c); return 0; }

    出力結果:
    1
    
  • 注意事項
  • 関数のリロードは、必然的に同じ役割ドメインで
  • に発生する.
  • コンパイラはパラメータリストと関数タイプで関数選択を行う必要があり、関数が関数ポインタに再ロードされるときに関数タイプ
  • をマッチングする必要がある.
  • は、関数名から直接リロード関数を得ることができないエントリアドレス
  • である.

    2.C++とC相互呼び出し
  • 実際の工事はC++とCコードの相互呼び出しが避けられない
  • である.
  • C++コンパイラはC言語のコンパイル方式と互換性があるが、一般的にはC++コンパイル方式
  • が優先的に使用される.
  • externキーワード強制C++コンパイラにC方式のコンパイル
  • をさせる
    extern "C"
     {
      // do C-style compilation here
    }
    

    質問:どのようにしてCコードがCコンパイラの下でもC++コンパイラの下でもCの方法でしかコンパイルされないことを保証しますか?ソリューション:
  • __cplusplusはC++コンパイラ内蔵の標準マクロ定義
  • である.
  • __cplusplusの意味:Cコードが統一的なC方式でターゲットファイル
  • にコンパイルされることを確保する.
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    // C-Style Compilation
    
    #ifdef __cplusplus  
    }
    #endif
    

    注意事項:
  • C++コンパイラは、Cでリロード関数
  • をコンパイルすることはできません.
  • コンパイル方式は、関数名がコンパイルされたターゲット名を決定する
  • C++コンパイル方式関数名とパラメータリストをターゲット名
  • にコンパイルする.
  • Cコンパイル方式は、関数名のみをターゲット名としてコンパイル
  • を行う.

    3.まとめ:
  • 関数のリロードはC++のCに対する重要なアップグレード
  • である.
  • 関数リロード関数パラメータリストによって異なる同名関数を区別する
  • externキーワードは、CとC++の相互呼び出しを実現することができるが、externコードブロックには、リロード関数
  • が絶対に存在してはならない.
  • コンパイル方式は、シンボルテーブルの関数名と最終ターゲット名
  • を決定する.
    声明:この文章は私がディテ学院の《C++深さ解析教程》を勉强したノートだけで、文章の中にディテのソフトウェアの资料の内容が含まれて、すべての著作権はディテのソフトウェアの所有に帰ります!実験環境:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)