繁体   English   中英

extern “C” 静态 void* 函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM