【发布时间】:2014-10-30 07:25:44
【问题描述】:
除了链接相关的东西之外,我在标准中没有看到任何评论。
虽然标准没有说明调用约定,但在现实世界中,C 和 C++ 之间的调用约定可能有所不同,所以我预计 C 函数和 C++ 函数的类型是不同的。但似乎不是,尤其是在 GCC 中。
#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");
static_assert 失败,因为 GCC 认为这些函数具有相同的类型。
-
extern "C"是函数类型的一部分吗? - 如何检查函数是使用 C 调用约定还是 C++ 调用约定?
【问题讨论】:
-
C++ 支持例如函数重载。具有不同参数类型但名称相同的两个函数 - 它不能通过 C 链接完成,因为函数名称需要被修改以保持唯一。
-
@keltar 是的,你是对的,这不是我在这里要问的。这是关于调用约定,而不是名称修改。我在互联网上找到的关于
extern "c"的每个文档和 Q/A 都提到了名称修改,而不是调用约定。 -
因为它不能用于方法(因此不能影响 thiscall)- 是的,它应该只禁用修改而不修改约定,除非另有明确指定(例如使用
__attribute__编译器特定命令)。您比较的两种类型都是int (*)(int)。 -
也许有点不那么晦涩 - C++ 已经对普通函数使用了与 C 相同的约定(但是方法并非如此),所以这里没有什么可以改变的。但是,C 约定会随着您使用的 ABI 而变化,因此对于 C 和 C++,它在 32 位、64 位系统 V、64 位窗口等之间会有所不同。
-
@keltar 大多数 C++ 编译器会破坏一切,包括普通函数,除非被告知不要这样做。
标签: c++ c c++11 calling-convention