继我对这个问题的回答之后,在C++ 11和C++ 14中:
[C++11, C++14: 25.5/2]:内容与标准C库头相同<stdlib.h>,但以下情况除外:
[C++11, C++14: 25.5/3]:功能签名: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 *));两者都具有与原始声明相同的行为.
然而,
[C++11, C++14: 7.5/5]:如果两个声明声明具有相同名称的函数,并且参数类型列表(8.3.5)是同一命名空间的成员,或者声明具有相同名称的对象是同一命名空间的成员,并且声明为这些名称提供不同的语言链接,该计划是不正常的; 如果声明出现在不同的翻译单元中,则无需诊断.[..]
这是一个缺陷吗?
除了链接相关的东西,我没有在标准中看到任何评论.
虽然标准没有说调用约定,但在现实世界中C和C++之间的调用约定可能不同,所以我期望C函数和C++函数的类型不同.但似乎没有,特别是在海湾合作委员会.
#include <type_traits>
extern "C" {
int c_func(int);
}
int cpp_func(int);
static_assert(!std::is_same<decltype(c_func), decltype(cpp_func)>::value,
"It should not be the same type");
Run Code Online (Sandbox Code Playgroud)
static_assert 由于GCC认为这些功能具有相同的类型,因此失败.
extern "C"函数类型的一部分吗?