C++ 标准 17.6.1.2 第 4 段(强调我的):
除第 18 至 30 条和附录 D 中另有说明外,每个标题的内容cname
应与相应标题的内容相同name.h
,如 C 标准库 (1.2) 或 C Unicode TR 中规定的,视情况而定,如同通过包容。但是,在 C++ 标准库中,声明(在 C 中定义为宏的名称除外)在 namespace 的命名空间范围 (3.3.6) 内std
。 未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明(7.3.3)注入命名空间。std
g++ 采用后一种方式,这样一些相同的头文件可以被 C 和 C++ 重用。所以允许g++double log(double)
在全局命名空间中声明和定义。
第 17.6.4.3.3 节第 3 和第 4 段:
使用外部链接声明的标准 C 库中的每个名称都保留给实现,以在命名空间和全局命名空间中用作具有extern "C"
链接的名称。std
使用外部链接声明的标准 C 库中的每个函数签名都保留给实现,以用作具有extern "C"
和extern "C++"
链接的函数签名,或作为全局命名空间中命名空间范围的名称。
在第 17.6.4.3 节第 2 段的顶部:
如果程序在保留名称的上下文中声明或定义名称,除非本条款明确允许,否则其行为未定义。
另一方面,您不得以任何方式声明或定义::log
。
不过,g++ 工具链没有给您任何错误消息,这太糟糕了。