【问题标题】:What is the purpose of extern C AND C++ for a single function (bsearch / qsort)? [duplicate]extern C AND C++ 用于单个函数(bsearch / qsort)的目的是什么? [复制]
【发布时间】:2017-07-15 20:00:14
【问题描述】:

在浏览标准草案 (N4527) 时,我发现了以下段落 ([alg.c.library]):

函数签名:

bsearch(const void *, const void *, size_t, size_t,
    int (*)(const void *, const void *));

替换为两个声明:

extern "C" void* bsearch(const void* key, const void* base,
                         size_t nmemb, size_t size,
                         int (*compar)(const void*, const void*));
extern "C++" void* bsearch(const void* key, const void* base,
                           size_t nmemb, size_t size,
                           int (*compar)(const void*, const void*));

qsort 也一样。

我也在 [dcl.link] 中找到:

如果两个声明将具有相同名称和参数类型列表 (8.3.5) 的函数声明为同一命名空间的成员,或者将具有相同名称的对象声明为同一命名空间的成员,并且声明给出了名称不同的语言链接,程序格式不正确;

这两个extern声明同一个函数的目的是什么?为什么这个块不是格式错误的?

【问题讨论】:

  • 您的目标是哪个标准?似乎发生了变化,因为如果我正确理解[extern.names]/4,那么如果这些功能被标记为extern,那么它就是实现定义的。
  • @Rakete1111 N4527

标签: c++


【解决方案1】:

参数类型列表不一样。真的。我不是在开玩笑。两个compar 参数的类型不同:在第一个声明中,因为函数是extern "C",所以compar 函数也是extern "C";在第二个中,compar 函数是extern C++"。这就是为什么有两个声明的原因:这样你就可以调用 bsearch 与任何一种语言链接的函数。

【讨论】:

  • 请注意,大多数实现都违反了这部分标准。
  • 值得一提的是cstdlib synopsis。最新的标准草案有一些有用的别名,以使其更清晰。
  • 您的意思是链接说明符也适用于参数?实际上,我无法编译这两个声明,这与@MarcGlisse 评论有关吗?
猜你喜欢
  • 2019-07-21
  • 2012-09-15
  • 1970-01-01
  • 2013-10-09
  • 2011-02-17
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多