浏览标准草稿(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
声明相同功能的目的是什么?为什么这个区块没有形成错误?
答案 0 :(得分:16)
参数类型列表不相同。真。我不是在开玩笑。两个compar
参数具有不同的类型:在第一个声明中,因为函数是extern "C"
,compar
函数也是extern "C"
;在第二个中,compar
函数是extern C++"
。这就是为什么有两个声明的原因:这样你就可以使用任何一种语言链接调用bsearch
。