Calling C from C++
The following example is a C++ program that calls a C function named csayhello().
This call can be made directly because the function is declared in the C++ program as
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);
}
The C function requires no special declaration and appears as follows:
/* csayhello.c */
#include <stdio.h>
void csayhello(char *str)
{
printf("%s\n",str);
}
The following three commands compile the two programs and link them into an
executable. The flexibility of g++ and gcc allow this to be done in different ways, but
this set of commands is probably the most straightforward:
$ g++ -c cpp2c.cpp -o cpp2c.o
$ gcc -c csayhello.c -o csayhello.o
$ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c
Notice that it is necessary to specify the standard C++ library in the final link because
the gcc command is used to invoke the linker instead of the g++ command. If g++ had
been used, the C++ library would have been implied.
It is most common to have the function declarations in a header file and to have the
entire contents of the header file included as the extern "C" declaration. The syntax
for this is standard C++ and looks like the following:
extern "C" {
int mlimitav(int lowend, int highend);
void updatedesc(char *newdesc);
double getpct(char *name);
};
對於庫函數,應該是直接調用。
對於自定義函數,可能需要改一下頭文件。
在所有宏定義和函數說明之前加入:
#ifdef __cplusplus
extern "C" {
#endif
在所有宏定義和函數說明之後加入:
#ifdef __cplusplus
}
#endif
例如:以下是我自己寫得一個頭文件
typedef struct{
int year;
int month;
int day;
}date;
int GetWeekNo(date);
修改後就變成
#ifdef __cplusplus
extern "C" {
#endif
typedef struct{
int year;
int month;
int day;
}date;
int GetWeekNo(date);
#ifdef __cplusplus
}
#endif
注意大小寫,以及cplusplus前面是兩條下劃線。