gpt4 book ai didi

c++ - extern "C"static void* 函数

转载 作者:可可西里 更新时间:2023-11-01 17:57:27 44 4
gpt4 key购买 nike

在阅读了 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 根本不被导出,所以它基本上甚至没有名字(它有 internal,不是外部链接)。

extern "C" 还有一个辅助作用。它也成为 footype 的一部分。也就是说,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" 并且它变得正确 - 你是安全的。

关于c++ - extern "C"static void* 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447615/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com