外接 "C" static void*函数

在阅读了关于extern和static的知识后,我很困惑地看到了下面这行代码。

extern "C" static void* foo(int* a){
    return foo1(a);
}

为什么这段代码没有产生任何错误?

解决方案:

下面的代码也可以编译,并且和你的代码一样。

extern "C" {
  static void* foo(int* a){
    return foo1(a);
  }
}

The 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++约定。这使得它可以安全地传递一个函数指针给 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++",它被传递到第二个。如果声明 fooextern "C" 然后尝试将其传递到一个期望指向C函数指针的C函数中。它将 可能 工作,但也可能会断得很可怕。添加 extern "C" 它变得正确,你是安全的。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何在Python中对特定范围的彩票游戏进行编码?[已关闭]

2022-9-13 15:24:40

未分类

在React+Electron中Router里面出错了。

2022-9-13 15:35:16

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索