C++ 外部C和C+的目的是什么+;对于单个功能(b搜索/qsort)?

C++ 外部C和C+的目的是什么+;对于单个功能(b搜索/qsort)?,c++,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,

在浏览标准草案(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
声明相同函数的目的是什么?为什么此块不是格式错误?

参数类型列表不同。真正地我不是开玩笑。两个
compar
参数有不同的类型:在第一个声明中,因为函数是
extern“C”
,所以
compar
函数也是
extern“C”
;在第二种情况下,<代码> COMPAR< <代码>函数为<代码>外部C++“。这就是为什么有两种声明的原因:这样您就可以使用任何一种语言链接的函数调用
bsearch

您的目标是哪种标准?似乎已经改变了,因为如果我理解正确,如果这些函数被标记为
extern
@Rakete1111 n4527,则是实现定义的。请注意,大多数实现违反了标准的这一部分。值得一提的是。最新的标准草案中有一些有用的别名,让它更清晰。你是说链接说明符也适用于参数?实际上,我无法编译这两个声明,这与@marglisse comment有关吗?