浏览标准草案(N4527)时,我发现了以下段落([alg.c.library]):
功能签名:
Run Code Online (Sandbox Code Playgroud)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*));
同样的东西qsort.
我也在[dcl.link]中找到了:
如果两个声明声明具有相同名称的函数,并且参数类型列表(8.3.5)是同一命名空间的成员,或者声明具有相同名称的对象是同一命名空间的成员,并且声明为这些名称提供不同的语言链接,该计划是不正常的;
这两个extern声明相同功能的目的是什么?为什么这个区块没有形成错误?
Pet*_*ker 16
参数类型列表不相同.真.我不是在开玩笑.这两个compar参数有不同的类型:在第一个声明中,因为函数是extern "C",compar函数也是extern "C"; 在第二个,compar功能是extern C++".这就是为什么有两个声明:这样你就可以bsearch使用任何语言链接来调用函数.