foo1需要一个指向C函数的指针,如[dcl.link] 7.5p4所示。
在链接规范中,指定的语言链接适用于所有函数声明符、具有外部链接的函数名和在链接规范中声明的具有外部链接的变量名的函数类型。 [示例:
extern "C" void f1(void(*pf)(int));
// 函数f1及其函数类型具有C语言链接;pf是指向C函数的指针
这个示例直接适用于foo1
,添加了重点突出我认为的原因。函数的参数列表包括一个参数的函数声明符,所有函数声明符都受到链接规范的影响。这适用于大括号和非大括号链接规范。
如果不使用大括号,则存在一些差异,名称会自动成为extern
,并且禁止显式使用存储说明符。
extern "C" int i;
int main() {
i = 1;
}
extern "C" static void g();
作为需要考虑这种差异的一个例子,考虑包含以下内容的标头:
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;
}
extern "C++" typedef void (*CPPFUNC)(); extern "C" void foo(CPPFUNC);
- bames53extern "C"
是用于声明函数在链接名称(名称混淆)中不应包含参数类型,这是 C++ 进行函数重载的方式。这样,C++ 就可以使用纯 C 库,例如 stdlib。 - epatel