外部"C"静态空隙*功能
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
根本无法导出,因此它基本上甚至没有名称(它有内部,而不是外部链接)。
CCD_ 9也具有次要作用。它也成为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"
,它就变得正确了——你是安全的。
相关文章:
- 如何在C++中获得"静态纯虚拟"功能?
- 当我链接两个静态C++库时,我可以在两个主函数库中有两个主要功能吗?
- 共享库中静态功能成员的破坏顺序
- 当使用嵌套类功能时,使用非静态数据成员的使用无效,但是当函数未固定时可以
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 功能指针的静态初始化
- C++ 静态内部功能
- 编译器生成的移动成员在静态数据成员上功能
- 线程安全性和静态变量/成员功能
- 在CPP中访问静态功能的指针
- 模板类中的静态功能:GCC与VS
- 为什么“静态”功能在不同的tu中不会破坏ODR
- 如何在Qt中使用静态插槽功能
- 模板静态功能模板类类型扣除
- 静态初始化包含功能指针的对象的constexpr std ::数组
- 如何在C 类中调用静态库功能
- 确实被认为是实验性的 - 静态反射功能包括对母类的迭代
- 在功能静态变量上调用Setter一次
- 在编译时检查课堂中是否可以使用静态功能