单个函数(bsearch / qsort)的外部C和C ++的目的是什么?

时间:2017-07-15 20:00:14

标签: c++

浏览标准草稿(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声明相同功能的目的是什么?为什么这个区块没有形成错误?

1 个答案:

答案 0 :(得分:16)

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