C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++でのextern「C」の効果は何ですか?


extern“ C”キーワードは、C++の関数名にCリンケージを持たせるために使用されます。この場合、コンパイラは関数をマングルしません。最初にC++のマングリングとは何かを見てみましょう。次に、外部の「C」キーワードについて説明します。

C ++では、関数のオーバーロード機能を使用できます。この機能を使用して、同じ名前の関数を作成できます。唯一の違いは、引数のタイプと引数の数です。ここでは、リターンタイプは考慮されていません。ここで、C ++がオブジェクトコード内のオーバーロードされた関数をどのように区別するかが問題になりますか?

オブジェクトコードでは、引数に関する情報を追加して名前を変更します。ここで適用される手法は、名前マングリングと呼ばれます。 C ++には、名前マングリングのための標準化された手法がありません。したがって、コンパイラが異なれば、使用する手法も異なります。

これが名前マングリングの例です。オーバーロードされた関数はfunc()という名前で、別の関数my_function()があります。

int func(int x) {
   return x*x;
}
double func(double x) {
   return x*x;
}
void my_function(void) {
   int x = func(2); //integer
   double y = func(2.58); //double
}

一部のC++コンパイラは以下のように変更します-

int __func_i(int x){
   return x*x;
}
double __func_d(double x){
   return x*x;
}
void __my_function_v(void){
   int x = __func_i(2); //integer
   double y = __func_d(2.58); //double
}

Cは関数のオーバーロードをサポートしていないため、C ++でCコードをリンクするときは、シンボルの名前が変更されていないことを確認する必要があります。次のC++コードはエラーを生成します。

int printf(const char *format,...);
main() {
   printf("Hello World");
}

出力

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status

この問題は、printf()の名前がコンパイラによって変更されたために発生しています。また、更新されたprintf()関数の定義が見つかりません。この問題を解決するには、C++でextern「C」を使用する必要があります。このブロック内でコードが使用されている場合、C++コンパイラは関数名がマングルされていないことを確認します。したがって、名前は変更されません。したがって、この問題を解決するには、上記のコードは次のようになります。

extern "C"{
   int printf(const char *format,...);
}
main() {
   printf("Hello World");
}

出力

Hello World

注: これらのコードブロックは、コンパイラごとに異なる結果を生成する可能性があります。

したがって、外部「C」は基本的に1つのリンケージ仕様です。すべてのコンパイラで、このキーワードを使用してCリンケージを指定する必要があります。また、リンケージ仕様は名前空間スコープに含まれている必要があることに注意する必要があります。クラスメンバーは外部「C」から無視されます


  1. C ++のconstキーワードとは何ですか?

    const修飾子を使用して、変数を定数として宣言します。つまり、変数が初期化されると、値を変更することはできません。 constを使用すると、非常に大きなメリットがあります。たとえば、PIの値のような定数値がある場合、プログラムのどの部分もその値を変更したくないでしょう。したがって、それを定数として宣言する必要があります。 const修飾型で宣言されたオブジェクトは、コンパイラによって読み取り専用メモリに配置される場合があります。また、constオブジェクトのアドレスがプログラムに取り込まれない場合は、まったく格納されない場合があります。たとえば、 #include<iostream&

  2. C ++を学ぶための良いリソースは何ですか?

    Webには、C++の学習に役立つ多くのリソースがあります。私はあなたにC++を学ぶためにそこにある最高のリソースのいくつかのコンパイルされたリストを提供しようとしました- C ++ −これは、C ++のほとんどすべての基本トピックと中間トピックを詳細にカバーし、C ++を学ぶための全体的に優れたリソースであるため、C++を学ぶのに最適な場所です。 C ++(Bjarne Stroustrup)のツアー- 「ツアー」は、C ++をすでに知っているか、少なくとも経験豊富なプログラマー向けの、中程度の高レベルでのすべての標準C ++(言語と標準ライブラリ、およびC ++ 11の使用)の簡