在阅读了extern和static之后,我很困惑地遇到了下面这行代码:
extern "C" static void* foo(int* a){
return foo1(a);
}
Run Code Online (Sandbox Code Playgroud)
为什么这不会产生任何错误?
小智 6
以下也编译并执行与您的行相同的操作:
extern "C" {
static void* foo(int* a){
return foo1(a);
}
}
Run Code Online (Sandbox Code Playgroud)
在static那意味着foo()将只在文件范围内使用,并覆盖extern "C",当谈到联动。通常,extern "C"如果/当导出时,会影响链接器使用的函数的名称,以便在链接整个程序时可以从其他目标文件调用该函数。通常,当您想要链接到从 C 源代码构建的目标文件时foo(),或者您想要定义的位置foo()以便 C 代码可以调用它时,就会使用它。然而,根本没有被导出的static原因foo,所以它基本上甚至没有名字(它有内部链接,而不是外部链接)。
extern "C"也有次要作用。这也成为部分类型的foo。也就是说,C++ 代码将被foo视为具有类型extern "C" void(int*)。基本上,这控制调用约定。例如,C++ 编译器可以在寄存器/堆栈中以与 C 编译器不同的方式排列参数。使foo是C功能的装置,这将使用C约定,而不是C ++约定。这使得例如将函数指针传递给需要指向fooC 函数的指针的 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);
Run Code Online (Sandbox Code Playgroud)
使用extern "C",&foo传递给第一个重载,但没有它/使用extern "C++",则传递给第二个。它不会是安全的声明foo没有extern "C",然后尝试将它传递到C函数需要一个指向C函数。它可能会起作用,但它也可能会严重崩溃。添加extern "C"并且它变得正确 - 你是安全的。
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |