关键字(原因在extern关键字那节已经介绍)。它的代码如下:
#ifndef C_HEADER
#define C_HEADER
extern void print(int i);
#endif C_HEADER
i);
相对应的实现文件为cHeader.c的代码为:
#i nclude <stdio.h>
#i nclude "cHeader.h"
void print(int i)
{
printf("cHeader %d\n",i);
}
,i);
现在C++(www.cppentry.com)的代码文件C++(www.cppentry.com).cpp中引用C中的print(int i)函数:
extern "C"{
#i nclude "cHeader.h"
}
int main(int argc,char** argv)
{
print(3);
return 0;
}
char**
argv)
执行程序输出:
3.4、C中调用C++(www.cppentry.com)的代码
现在换成在C中调用C++(www.cppentry.com)的代码,这与在C++(www.cppentry.com)中调用C的代码有所不同。如下在cppHeader.h头文件中定义了下面的代码:
#ifndef CPP_HEADER
#define CPP_HEADER
extern "C" void print(int i);
#endif CPP_HEADER
int i);
相应的实现文件cppHeader.cpp文件中代码如下:
#i nclude "cppHeader.h"
#i nclude <iostream>
using namespace std;
void print(int i)
{
cout<<"cppHeader "<<i<<endl;
}
| 1 |
#i
nclude "cppHeader.h" |
在C的代码文件c.c中调用print函数:
extern int print(int i);
int main(int argc,char** argv)
{
print(3);
return 0;
}
char**
argv)
注意在C的代码文件中直接#i nclude "cppHeader.h"头文件,编译出错。而且如果不加extern int print(int
i)编译也会出错。
4、C和C++(www.cppentry.com)混合调用特别之处函数指针
当我们C和C++(www.cppentry.com)混合编程(www.cppentry.com)时,有时候会用一种语言定义函数指针,而在应用中将函数指针指向另一中语言定义的函数。如果C和C++(www.cppentry.com)共享同一中编译和连接、函数调用机制,这样做是可以的。然而,这样的通用机制,通常不然假定它存在,因此我们必须小心地确保函数以期望的方式调用。
而且当指定一个函数指针的编译和连接方式时,函数的所有类型,包括函数名、函数引入的变量也按照指定的方式编译和连接。如下例:
typedef int (*FT) (const void* ,const void*);//style of C++(www.cppentry.com)
extern "C"{
typedef int (*CFT) (const void*,const void*);//style of C
void qsort(void* p,size_t n,size_t sz,CFT cmp);//style of C
}
void isort(void* p,size_t n,size_t sz,FT cmp);//style of C++(www.cppentry.com)
void xsort(void* p,size_t n,size_t sz,CFT cmp);//style of C
//style of C
extern "C" void ysort(void* p,size_t n,size_t sz,FT cmp);
int compare(const void*,const void*);//style of C++(www.cppentry.com)
extern "C" ccomp(const void*,const void*);//style of C
vo