foo1 采用指向 C 函数的指针,如 [dcl.link] 7.5p4 中所示
在链接规范中,指定的语言链接适用于所有函数声明符的函数类型、具有外部链接的函数名以及链接规范中声明的具有外部链接的变量名。[例子:
extern "C" void f1(void(*pf)(int));
// 名称 f1 及其函数类型具有 C 语言
// 链接;pf 是指向 C 函数的指针
该示例直接适用于foo1
并且添加的重点突出了我认为的原因。函数的参数列表包含一个参数的函数声明符,所有函数声明符都受链接规范的影响。这适用于支撑和非支撑连杆规范。
不使用大括号时的一些区别是名称是自动extern
的,并且禁止显式使用存储说明符。
extern "C" int i; // not a definition
int main() {
i = 1; // error, no definition
}
extern "C" static void g(); // error
作为这种差异重要的示例,请考虑包含以下内容的标头:
extern "C" int a;
extern "C" double b;
extern "C" char c;
有人可能会想将其更改为:
extern "C" {
int a;
double b;
char c;
}
但这将是不正确的,因为这会将声明转换为定义。相反,使用的正确代码extern "C" {}
是:
extern "C" {
extern int a;
extern double b;
extern char c;
}