9_関数リロード解析(下)
2026 ワード
キーワード:関数リロードとポインタ、
1.リロードとポインタリロード関数名を関数ポインタに付与する場合 リロード規則に従って関数ポインタパラメータリストと一致する候補 を選択する.候補の関数タイプと関数ポインタの関数タイプを厳密に一致させる
プログラミング実験:関数リロードVS関数ポインタ
出力結果:注意事項 関数のリロードは、必然的に同じ役割ドメインで に発生する.コンパイラはパラメータリストと関数タイプで関数選択を行う必要があり、関数が関数ポインタに再ロードされるときに関数タイプ をマッチングする必要がある.は、関数名から直接リロード関数を得ることができないエントリアドレス である.
2.C++とC相互呼び出し実際の工事はC++とCコードの相互呼び出しが避けられない である. C++コンパイラはC言語のコンパイル方式と互換性があるが、一般的にはC++コンパイル方式 が優先的に使用される. をさせる
質問:どのようにしてCコードがCコンパイラの下でもC++コンパイラの下でもCの方法でしかコンパイルされないことを保証しますか?ソリューション: である. にコンパイルされることを確保する.
注意事項: C++コンパイラは、Cでリロード関数 をコンパイルすることはできません.コンパイル方式は、関数名がコンパイルされたターゲット名を決定する C++コンパイル方式関数名とパラメータリストをターゲット名 にコンパイルする. Cコンパイル方式は、関数名のみをターゲット名としてコンパイル を行う.
3.まとめ:関数のリロードはC++のCに対する重要なアップグレード である.関数リロード関数パラメータリストによって異なる同名関数を区別する が絶対に存在してはならない.コンパイル方式は、シンボルテーブルの関数名と最終ターゲット名 を決定する.
声明:この文章は私がディテ学院の《C++深さ解析教程》を勉强したノートだけで、文章の中にディテのソフトウェアの资料の内容が含まれて、すべての著作権はディテのソフトウェアの所有に帰ります!実験環境:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
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相互呼び出し
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
注意事項:
3.まとめ:
extern
キーワードは、CとC++の相互呼び出しを実現することができるが、extern
コードブロックには、リロード関数声明:この文章は私がディテ学院の《C++深さ解析教程》を勉强したノートだけで、文章の中にディテのソフトウェアの资料の内容が含まれて、すべての著作権はディテのソフトウェアの所有に帰ります!実験環境:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)