CとC++の混合コンパイル初歩


Mix C Cpp
目次
[非表示]
1 CとC++の混合プログラミング2 C++呼び出しC関数3 C呼び出しC++関数4その他の参照[編集]CとC++の混合プログラミング
C++はC言語に基づいて発展してきた.ある程度、C++をCの拡張と見なすことができます.本質的には,両者のデータ型と関数呼び出しの慣行は一致しているので,CとC++のハイブリッドコンパイルも自然なことである.
両者の違いは、コンパイル後の関数の名前が異なることだけです.Cはパラメータの個数やタイプを考慮せずに関数名を簡単に使用しますが、C++コンパイル後の関数名は常にパラメータタイプリストをその一部として使用します.それでも、C++はC関数を宣言する特殊なメカニズムを提供し、これは、C++プログラムが直接C関数を宣言し、呼び出すことができることを意味する.
[編集]C++呼び出しC関数
以下に、C++プログラム呼び出しC関数csayhello()の一例を示す.この関数は、C++プログラム内で宣言するときにextern"C"を使用するため、呼び出しは直接行うことができます.
/* cpp2c.cpp */
#include <iostream>
extern "C" void csayhello(char *str);
int main(int argc,char *argv[])
{
    csayhello("Hello from cpp to c");
    return(0);
}

C関数は特別な処理を必要とせず、そのコードは以下の通りである.
/* csayhello.c */
#include <stdio.h>
void csayhello(char *str)
{
    printf("%s
"
,str); }

次の3つのコマンドは、上記の2つのファイルをコンパイルし、両方を実行可能なファイルにリンクします.gccとg++の柔軟性により、このタスクを完了する方法は多くありますが、この3つのコマンドが最も一般的かもしれません.
$ g++ -c cpp2c.cpp -o cpp2c.o
$ gcc -c csayhello.c -o csayhello.o
$ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c

最後のリンク時にC++標準ライブラリを指定する必要があることに注意してください.これは、g++呼び出しのリンクではなくgccを使用しているからです.g++を使用している場合、C++標準ライブラリはデフォルトでリンクされます.
最も一般的な方法は、関数宣言をヘッダファイルに配置し、すべての内容をextern「C」宣言ブロックに含めることです.ファイルの内容は次のようになります.
extern "C" {
    int mlimitav(int lowend, int highend);
    void updatedesc(char *newdesc);
    double getpct(char *name);
};

[編集]C呼び出しC++関数
CプログラムがC++の関数を呼び出すことができるようにするには、C++がC呼び出しの慣例に合致する関数を提供する必要があります.次の例では、C++内でC関数を作成する構文を示します.
/* cppsayhello.cpp */
#include <iostream>
extern "C" void cppsayhello(char *str);
void cppsayhello(char *str)
{
    std::cout << str << "
"
; }

関数cppsayhello()はextern"C"によってC関数として宣言されているが、実際にはC++ソースコードの一部であり、これは関数体内が本当のC++コードであることを意味する.関数内では、オブジェクトを自由に作成および解析できます.cppsayhello()内でC関数を呼び出す場合は、extern「C」と宣言する必要があります.それ以外の場合、コンパイラはC++関数として機能し、それに応じて関数名が変更されます.
C++関数cppsayhello()を呼び出すCプログラムを次に示します.
/* c2cpp.c */
int main(int argc,char *argv[])
{
    cppsayhello("Hello from C to C++");
    return(0);
}

次のコマンドは、c 2 cppを生成するためにコンパイルされ、リンクされます.
$ g++ -c cppsayhello.cpp -o cppsayhello.o
$ gcc -c c2cpp.c -o c2cpp.o
$ gcc cppsayhello.o c2cpp.o -lstdc++ -o c2cpp
http://wiki.ubuntu.org.cn/index.php?title=Mix_C_Cpp&variant=zh-cn