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

Hol*_*olt 15 c++

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

功能签名:

bsearch(const void *, const void *, size_t, size_t,
    int (*)(const void *, const void *));
Run Code Online (Sandbox Code Playgroud)

被两个声明取代:

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*));
Run Code Online (Sandbox Code Playgroud)

同样的东西qsort.

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

如果两个声明声明具有相同名称的函数,并且参数类型列表(8.3.5)是同一命名空间的成员,或者声明具有相同名称的对象是同一命名空间的成员,并且声明为这些名称提供不同的语言链接,该计划是不正常的;

这两个extern声明相同功能的目的是什么?为什么这个区块没有形成错误?

Pet*_*ker 16

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