在回答这个问题之后,无论是C++11还是C++14:
[C++11, C++14: 25.5/2]:
内容与标准C库头文件<stdlib.h>
相同,但以下内容除外:
[C++11, C++14: 25.5/3]:
函数签名为:
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 *));
这两个声明具有与原始声明相同的行为。
然而,
[C++11,C++14:7.5 / 5]:
如果两个声明声明具有相同名称和参数类型列表(8.3.5)的函数为同一命名空间的成员,或者声明具有相同名称的对象为同一命名空间的成员,并且声明为不同的语言链接提供了名称,则程序是有缺陷的;如果声明出现在不同的翻译单位中,则不需要进行诊断。 [..]这是一个缺陷吗?
compar
具有不同的类型...尽管如果是这样的话,我想要一些简单的方法来为类型声明它,但我不知道有没有这样的方法。 - Deduplicatortemplate <typename R, typename...T> using CxxFunc = R(T...); extern "C" { template <typename R, typename...T> using CFunc = R(T...); }
。将compar
声明为CFunc<int,const void*,const void*>
和CxxFunc<...>
。大多数实现都会拒绝它,因为它们不允许在extern "C"
块中使用模板,但这是完全有效的。限制是模板不能具有extern "C"
链接,而不是模板不能出现在extern "C"
块中。模板别名没有语言链接,所以没问题。 - user743382qsort
,还有25.4/4)。 - Cubbi