12

私はCとC++にまったく慣れていません。しかし、Cから呼び出す必要のあるC++関数がいくつかあります。実行する必要があることの例を作成しました。


main.c

#include "example.h"      
#include <stdio.h>

int main(){   
    helloWorld();
    return 0;
}

example.h

 #ifndef HEADER_FILE
 #define HEADER_FILE

 #ifdef __cplusplus
     extern "C" {
 #endif
         void helloWorld();
 #ifdef __cplusplus
     }
 #endif

 #endif

example.cpp

#include <iostream.h>

void helloWorld(){
    printf("hello from CPP");
} 

それはうまくいきません。で未定義の参照のエラーが発生し_helloWorldますmain.c。問題はどこにありますか?

4

2 に答える 2

15

簡潔な答え:

example.cpp含める必要がありますexample.h

より長い答え:

C++ で関数を宣言すると、C++ リンケージと呼び出し規約が適用されます。(実際には、これの最も重要な機能は名前マ​​ングリングです。これは、C++ コンパイラがシンボルの名前を変更して、パラメーターの型が異なる同じ名前の関数を使用できるようにするプロセスです。) extern "C"(ヘッダー ファイルに存在します)それを回避する方法です-これは、Cコードから呼び出し可能なC関数であることを指定します。壊れていません。

これは良いスタートですがextern "C"、C ++ファイルにはそれが含まれておらずextern "C"、宣言にも含まれていないため、C関数としてコンパイルすることを認識していません。

于 2012-09-27T06:53:08.263 に答える
2

これextern "C"は、宣言された関数が C ABI (アプリケーション バイナリ インターフェイス) を使用する必要があることを C++ に伝えます。したがって、言語が C であろうと C++ であろうと、あなたvoid HelloWorld()は常に C であるため外部から見えます。

しかし、C ++のようにcppファイルに実装しましたが、Cは認識していません。

HelloWorldC と C++ の両方でコヒーレントのプロトタイプを作成する必要があるため、cpp ファイルはそれを として宣言するextern "C" void Helloworld() { /*your code here*/ }か、単純に example.cpp から #include "example.h" を宣言する必要があります。これにより、実装する前に、コンパイラは既にそれを認識しています。 C の規則に従う必要があります。

于 2012-09-27T07:00:47.973 に答える