最近调用一个C写的模块,加入C++工程中冒出许多错。原来是自己没有弄清楚C++调用C的方式。
文件后缀,C++为cpp, C为.c 。这个不要改变。
在C++中调用C 一般使用 extern "C"{}
示例:
1,C++中调用C
在C++包含C文件时 加上 extern "C"{}即可
eg:
/* c语言头文件:cTest.h */
#ifndef C_TEST_H
#define C_TEST_H
extern int max(int x,int y);
#endif
/* c语言实现文件:cTest.c */
#include "cTest.h"
int max( int x, int y )
{
return x > y ? x : y;
}
// c++实现文件,调用add:cppFile.cpp
extern "C"
{
#include "cTest.h"
}
int main(int argc, char* argv[])
{
max(1,10);
return 0;
}
如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。
2, C中调用C++
在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,即不要#include"" , 应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。
eg:
//C++头文件 cppTest.h
#ifndef CPP_TEST_H
#define CPP_TEST_H
extern "C" int max( int x, int y );
#endif
//C++实现文件 cppTest.cpp
#include "cppTest.h"
int max( int x, int y )
{
return x > y? x : y;
}
/* C实现文件 cFile.c
/* 这样会编译出错:#include "cTest.h" */
extern int max( int x, int y );
int main( int argc, char* argv[] )
{
add( 1, 10 );
return 0;
}
直接加extern 就可。
/
其实这个主要是因为C++与C编译阶段产生的目标符号不同,对于一个函数int max(int a, int b); C++编译产生的符号是_max_int_int 等等经过加入参数类型,参数个数的符号;而C中直接为_max;所以为了能在C++中或是在C中能顺利找到调用的函数或变量,就需要使用extern "C" 来改变调用的符号。 例如在C++中,如果加了extern "C",那么就按C的方式生成和查找。