第18章 特殊工具与技术(14)
18.7.3 链接指示:extern “c”
C++使用链接指示(linkage directive)指出任意非C++函数所用的语言。
1. 声明非C++函数
链接指示有两种形式:单个的或复合的。链接指示不能出现在类定义或函数定义的内部,它必须出现在函数的第一次声明上。
[cpp] #include <cstdlib>
extern "C" size_t strlen(const char*);
extern "C" {int strcmp(const char*,const char*);
char *strcat(char*,const char*);}
#include <cstdlib>
extern "C" size_t strlen(const char*);
extern "C" {int strcmp(const char*,const char*);
char *strcat(char*,const char*);}第一种形式由关键字extern后接字符串字面值,再接“普通”函数声明构成。字符串字面值指出编写函数所用的语言。
通过将几个函数的声明放在跟在链接指示之后的花括号内部,可以给他们设定相同的链接。花括号的作用是将应用链接所示的声明聚合起来,忽略了花括号,花括号中声明的函数名就是可见的,就像在花括号之外声明函数一样。
2. 链接指示与头文件
可以将多重声明形式应用与整个头文件。
[cpp] extern "C"{
#include <string.h>
}
extern "C"{
#include <string.h>
}允许将C++从C函数库继承而来的函数定义为C函数,担不是必须定义为C函数——决定是用C还是用C++实现C函数库,是每个C++实现的事情。
3. 导出C++函数到其他语言
[cpp] extern "C" double calc(double dparm){
return 0.0;
}
extern "C" double calc(double dparm){
return 0.0;
}通过对函数定义使用链接指示,使得用其他语言编写的程序可以使用C++函数。
用链表指示定义的函数的每个声明都必须使用相同的链接指示。
4. 链接指示支持的语言
要求编译器支持对C语言的链接指示,编译器可以为其他语言提供链接说明。例如,extern "Ada"、extern "FORTRAM"等。
5. 重载函数与链接指示
链接指示与函数重载之间的相互作用依赖于目标语言。如果语言支持重载函数,则为该语言实现链接指示的编译器很可能也支持C++的这些函数的重载。
C++保证支持的唯一语言是C。C语言不支持函数重载,所以,不应该对下面的情况感到惊讶:在一组重载函数中只能为一个C函数指定链接指示。用给定名字的C链接声明多于一个函数是错误的。
在C++程序中,重载C函数很常见,但是,重载集合中的其他函数必须都是C++函数。
6. extern “C”函数的指针
编写函数所用的语言是函数类型的一部分。为了声明用其他程序设计语言编写的函数的指针,必须使用链接指示。
C函数的指针与C++函数的指针具有不同的类型,不能将C函数的指针初始化或赋值为C++函数的指针。
摘自 xufei96的专栏