相关疑难解决方法(0)

C++ 11和C++ 14中`bsearch`的规范是否有缺陷?

继我对这个问题的回答之后,在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 *));
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 *));
Run Code Online (Sandbox Code Playgroud)

两者都具有与原始声明相同的行为.

然而,

[C++11, C++14: 7.5/5]:如果两个声明声明具有相同名称的函数,并且参数类型列表(8.3.5)是同一命名空间的成员,或者声明具有相同名称的对象是同一命名空间的成员,并且声明为这些名称提供不同的语言链接,该计划是不正常的; 如果声明出现在不同的翻译单元中,则无需诊断.[..]

这是一个缺陷吗?

c++ language-lawyer c++11 c++14 bsearch

45
推荐指数
1
解决办法
1739
查看次数

`extern"C"`是函数类型的一部分吗?

除了链接相关的东西,我没有在标准中看到任何评论.

虽然标准没有说调用约定,但在现实世界中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"函数类型的一部分吗?
  • 如何检查函数是否使用C调用约定或C++调用约定?

c c++ calling-convention c++11

13
推荐指数
1
解决办法
504
查看次数

标签 统计

c++ ×2

c++11 ×2

bsearch ×1

c ×1

c++14 ×1

calling-convention ×1

language-lawyer ×1