GCC与Clang竟都不符合C++标准?
Neither GCC nor Clang are compliant with standard C++
在C++中,函数类型本应关联特定的“language linkage”(语言链接),标准明确规定不同链接的函数类型即使其他方面相同也属于不同类型。然而,GCC和Clang编译器却忽略了这一细节,不存储语言链接信息,导致extern "C"定义的函数与普通C++函数被误判为相同类型。这不仅让某些静态断言失效,还可能引发函数重载时的编译错误。作者认为,问题根源不在编译器,而在于C++标准本身存在缺陷。由于修改会破坏ABI兼容性,GCC和Clang短期内无法调整行为。毕竟在绝大多数平台上,C和C++的调用约定本就一致,标准的这一规定显得多余且不合时宜。
在我看来,责任不在GCC或Clang,而在于标准本身——标准错了,应该更新以将这一行为定义为实现相关。
HN 评论区
58- kloop
鉴于 GCC 和 Clang 的默认行为,再加上建议去修改标准而不是修改 GCC 和 Clang 的说法,听起来倒像是标准本身不符合标准 C++ 了。
这里的“标准”指的是通常使用或默认提供的版本。
- jdw64
但看了这个,似乎 12 年前就发生过类似的事情 [1]。为什么至今还没改?
- Fudgel
- dataflow
> gcc and clang can't change their behavior because that would be a breaking ABI change
这是 API 变更。破坏源代码兼容性通常比破坏二进制兼容性更严重。
- rurban
这关乎语言的链接方式(linkages),而不是 extern "C" 与 C++ 链接的区别。
这关乎 stdcall、cdecl、fastcall、vectorcall、watcall 以及其他调用约定,它们本应包含在类型中。而它们确实包含在内。