2016-06-20 11 views
-3

https://isocpp.org/wiki/faq/mixing-c-and-cppが正しくない場合、extern "C"は、C++プログラムでC関数を呼び出すか、CプログラムでC++関数を呼び出すために使用されます。CプログラムでC++コードを呼び出すときに `extern" C "`は何をしますか?

C++プログラムでC関数を呼び出すために使用すると、C++コンパイラがextern "C"と宣言されたC関数の名前を変更することができなくなります。

CプログラムでC++関数を呼び出すために使用されるときはどうなりますか? また、CコンパイラがC++関数の名前を変更するのを防ぐのですか?

ありがとうございました。あなたがC C++から呼び出し可能なように機能させる必要がある場合

+0

さらに疑問がある場合は、前の質問の回答にコメントを使用して質問してください。ターゲットの移動を避け、既存の回答とスムーズに同期させます。 –

+1

これは別の方法です。 'extern" C "は、C++コンパイラがC言語で使用される(つまり、宣言され呼び出される)関数のマングル付きシンボルを生成するのを防ぎます。 –

+0

[C++ソースでは、 extern "C"?](http://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c) - 私の民間伝承では "C"もリンクされていますAPIだけでなくABIを修正することもありますが、たぶんそれは話です;-) – Dilettant

答えて

4

は、あなたが #ifdef __cplusplusextern "C"で宣言を囲む必要があります。

など。

#ifdef __cplusplus 
extern "C" { 
#endif 

    void foo(); 
    int bar(); 

#ifdef __cplusplus 
} 
#endif 

あなたがC++コンパイラとしてそれを見て、それを行う:extern "C"の存在はないとC++コンパイラに指示します

void foo(); 
int bar(); 

:としてCコンパイラはそれを見ながら

extern "C" { 
    void foo(); 
    int bar(); 
} 

名前をつけてください。 foobar。 Cコンパイラは名前を変更することはありません。したがって、それは全く 問題ではありません。他の宣言と同様に、2つの関数foobarが表示されます。

+0

この回答は、私が使用した二重ターゲットではカバーされていなかったものです。 – NathanOliver

+0

@ NathanOliver、Dupeターゲットは、 'extern" C "がCプログラムにどのような影響を与え、どのようにそれらの関数をCプログラムから呼び出すことができるかという問題に対処していません。それは、問題のC++側だけを扱います。 –

+0

@RSahu私は今、それをすべて修正して明らかにしたと思います。とにかく、欺瞞の質問を掲示することは適切な行為ではありません[私のコメントで述べたように](http://stackoverflow.com/questions/37928257/what-does-extern-c-do-when-calling-c- code-in-ac-program?noredirect = 1#comment63307280_37928257)。 –

関連する問題