链接指示符 extern "C"
程序员用链接指示符[linkage directive] 告诉编译器 该函数是用其他的程序设计语言编写的
// 单一语句形式的链接指示符
extern "C" void exit(int);
// 复合语句形式的链接指示符
extern "C" {
int printf( const char* ... );
int scanf( const char* ... );
}
// 复合语句形式的链接指示符
extern "C" {
#include <cmath>
}
链接指示符不能出现在函数体中 下列代码段将会导致编译 错误
int main()
{
// 错误 :链接指示符不能出现在函数内
extern "C" double sqrt( double );
double getValue(); //ok
double result = sqrt ( getValue() );
//...
return 0;
}
如果把链接指示符移到函数体外 程序编译将无错误
extern "C" double sqrt( double );
int main()
{
double getValue(); //ok
double result = sqrt ( getValue() );
//...
return 0;
}
例如
// 函数 calc() 可以被 C程序调用
extern "C" double calc( double dparm ) { /* ... */ }
============外链补充==============from http://blog.chinaunix.net/uid-24118190-id-2985318.html
用主程序的C调用C++的功能函数时总是提示该函数未定义(undefined)。这是什么问题?如何解决?
关键点在这里:我们就靠在C++的*.h和*.cpp的头尾加入下面代码才得以解决问题。
#ifdef __cplusplus
extern "C" {
#endif
//一段代码
#ifdef __cplusplus
}
#endif
其中 __cplusplus是cpp中的自定义宏。上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. 加入 extern "C" 声明的目的是解决C与C++的相互调用的问题。
文件c.h:
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
文件c.c:
#include "c.h"
void C_fun()
{
}
------------------------------------
在文件cpp.cpp中调用文件c.c中的函数C_fun()
cpp.cpp的实现
#include "c.h"
int main()
{
C_fun()
}
其中__cplusplus是C++编译器的保留宏定义.就是说C++编译器认为这个宏已经定义了.
所以关键是extern "C" {}
extern "C"是告诉C++编译器件括号里的东东是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找.
=========================