GCC 和 Clang 都不符合标准 C++
来源:sebsite.pw — 2026-07-08
📋 概述
C++ 标准规定函数类型携带 "language linkage"(如 C++、C 等),并且明确指出不同语言链接的函数类型属于不同的类型。然而 GCC 和 Clang 并没有在函数类型中保存语言链接信息,导致 extern "C" 函数类型与普通 C++ 函数类型被视为相同。这一行为违反了标准,但也让基于函数指针类型的重载代码无法编译。作者认为问题出在标准本身,应当将其改为实现定义行为,因为修正编译器行为会破坏 ABI 且并无实际收益。
🔑 核心要点
- C++ 标准为函数类型定义了 language linkage,不同 linkage 的类型即使签名相同也属于不同类型。
- GCC 和 Clang 未在类型系统中保存 language linkage,因此
extern "C" using c_func = void(); 与 void() 被判定为相同类型。
- 这导致
static_assert(std::is_same<c_func, void()>::value) 这种本应失败的断言意外通过。
- 对接受 C 函数指针与 C++ 函数指针的参数进行重载时,GCC 和 Clang 会因认为参数列表相同而报重定义错误。
- 作者认为责任不在编译器,而在标准;修改编译器会破坏 ABI(extern "C" 的 name mangling 会改变),且在主流平台上 C 与 C++ 调用约定并无区别。
💡 金句
这里的责任不在 GCC 或 Clang,而在标准本身。
👍 0
👎 0
← 返回 Lobsters 首页