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
。 尚不确定这些名称是先在全局名称空间范围内声明,然后std
通过显式using-declaration(7.3.3)注入名称空间。
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 ++工具链没有给您任何错误消息是非常糟糕的。