链接指示符extern C
如果程序员希望调用其他程序设计语言尤其是C 写的函数那么调用函数时必须
告诉编译器使用不同的要求例如当这样的函数被调用时函数名或参数排列的顺序可能
不同无论是C++函数调用它还是用其他语言写的函数调用它
程序员用链接指示符linkage directive 告诉编译器该函数是用其他的程序设计语言
编写的链接指示符有两种形式既可以是单一语句single statement 形式也可以是复
合语句compound statement 形式
// 单一语句形式的链接指示符
extern "C" void exit(int);
// 复合语句形式的链接指示符
extern "C" {
int printf( const char* ... );
int scanf( const char* ... );
}
// 复合语句形式的链接指示符
extern "C" {
#include <cmath>
}
链接指示符的第一种形式由关键字extern 后跟一个字符串常量以及一个普通的函数
声明构成,虽然函数是用另外一种语言编写的,但调用它仍然需要类型检查。例如编译器
会检查传递给函数exit()的实参的类型是否是int 或者能够隐式地转换成int 型。
多个函数声明可以用花括号包含在链接指示符复合语句中,这是链接指示符的第二种形
式。花招号被用作分割符,表示链接指示符应用在哪些声明上。所以在花括号中声明的
函数名对外是可见的,就好像函数是在复合语句外声明的一样。
例如在前面的例子中复合语句extern "C"表示函数printf()和scanf()是在C 语言中写的
函数,因此这个声明的意义就如同printf()和scanf()是在extern "C"复合语句外面声明的
一样。
当复合语句链接指示符的括号中含有#include 时,在头文件中的函数声明都被假定是用
链接指示符的程序设计语言所写的在前面的例子中在头文件<cmath>中声明的函数都是C
函数。
链接指示符不能出现在函数体中下列代码段将会导致编译错误