[英]extern “C” static void* function
在阅读了 extern 和 static 之后,我很困惑遇到以下行的代码:
extern "C" static void* foo(int* a){
return foo1(a);
}
为什么这不会产生任何错误?
以下也编译并执行与您的行相同的操作:
extern "C" {
static void* foo(int* a){
return foo1(a);
}
}
static
意味着foo()
仅在文件范围内可用,并且在涉及链接时会覆盖extern "C"
。 通常, extern "C"
影响链接器在导出时使用的函数的名称,以便在链接整个程序时可以从其他目标文件调用该函数。 通常,当您想要链接到定义了foo()
C 源代码构建的目标文件时,或者您想要定义foo()
以便 C 代码可以调用它时,就会使用它。 然而, static
导致foo
根本没有被导出,所以它基本上甚至没有得到一个名字(它有内部链接,而不是外部链接)。
extern "C"
也有次要作用。 它也成为foo
类型的一部分。 也就是说,C++ 代码会将foo
视为具有类型extern "C" void(int*)
。 基本上,这控制调用约定。 例如,C++ 编译器可能会在寄存器/堆栈中安排与 C 编译器不同的参数。 使foo
成为 C 函数意味着它将使用 C 约定而不是 C++ 约定。 这使得例如将指向foo
的函数指针传递给需要指向 C 函数的指针的 C 函数是安全的。 例如,标准库有
extern "C" typedef int C_CMP(void const*, void const*);
extern "C++" typedef int CXX_CMP(void const*, void const*);
void std::qsort(void *, std::size_t, std::size_t, C_CMP);
void std::qsort(void *, std::size_t, std::size_t, CXX_CMP);
使用extern "C"
, &foo
被传递给第一个重载,但没有它/使用extern "C++"
,它被传递给第二个。 在没有extern "C"
情况下声明foo
然后尝试将其传递给需要指向 C 函数的指针的 C 函数是不安全的。 它可能会起作用,但它也可能会严重崩溃。 添加extern "C"
就正确了——你很安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.