C++の関数からCの関数を呼び出すことは、日常的に行なわれています。例えば、C++で書かれたプログラムがsqrt()等の標準Cライブラリー を利用 する際には、無意識にC++の関数からCの関数への呼び出しが行なわれています。ここでは、その舞台裏と、自分で書いたC関数を呼び出す方法を説明しま す。
C++ソースファイル中で、これこれはCプログラム側で定義された関数あるいは変数であると宣言できます。次のように書きます。
extern "C" {
宣言の並び
}
通常は、これをヘッダーファイルに書きます。C++のソースからも、Cのソースからもインクルードできるように、C++コンパイラーで定義されるマ
クロ``__cplusplus
''を使って場合分けします。実際に、C
標準ライブラリーのヘッダーファイルは、このような構造をしています。
#ifndef __CSUB_H__
#define __CSUB_H__ 1
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
extern int csub(char const *param);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __CSUB_H__ */
C側のソースファイルは、先程のヘッダーファイルをインクルードする以外に、特別なことはありません。
#include "csub.h"
#include <stdio.h>
int csub(const char *param)
{
printf("csub(¥"%s¥") called¥n", param);
return 8086;
}
C++側のソースファイルも、先程のヘッダーファイルをインクルードする以外に、特別なことはありません。
#include "csub.h"
#include <iostream>
int main(int argc, char **argv)
{
std::cout << "cppmain.cpp begin" << std::endl;
int ret = 0;
ret = csub("parameter of function"); // This function is written in C.
std::cout << "csub() returns " << ret << std::endl;
std::cout << "cppmain.cpp end" << std::endl;
return 0;
}
gccとg++を使って、この例題をコンパイル、リンクする方法を示します。
gcc -Wall -c csub.c
g++ -Wall -c cppmain.cpp
g++ -Wall -o cppmain cppmain.o csub.o