【发布时间】:2018-06-19 09:54:16
【问题描述】:
这个问题是this one的后续问题。
考虑以下程序:
#include <cmath>
// meaningless, only for language-lawyer purpose
void abs(void*) {}
int main(){
abs(nullptr);
}
这个程序会导致未定义的行为吗?
标准中相关部分为[extern.names]/4:
使用外部链接声明的 C 标准库中的每个函数签名都保留给实现,以用作具有 extern "C" 和 extern "C++" 链接的函数签名,或作为命名空间范围的名称全局命名空间。
我不确定是否允许重载。
【问题讨论】:
-
我不知道行为是否未定义,但肯定是出乎意料的。
-
这是一个奇怪的段落。它以签名开始,这很清楚,然后是名称。
-
@Ron
int abs(int);是使用外部链接声明的 C 标准库中的函数签名。非粗体文本表示此签名是保留的;但是粗体部分继续说签名保留为名称,这没有意义 -
一些“功能”有时被实现为marcos - 例如
htons。虽然不是我所知道的“保留”功能,但它突出了一些实现的糟糕程度。 -
@UKMonkey:C++ 明确表示可以实现为函数或宏的 C 名称必须是 C++ 中的函数。但是,
htons不是标准 C 函数,这就是该规则未涵盖它的原因。
标签: c++ language-lawyer c++-standard-library reserved-words