在下面的代码中,我定义了一个简单的log
功能。在main
I try not调用它;我打电话std::log
。尽管如此,我自己的log
叫做;我看到“日志!”在屏幕上。有谁知道为什么?我使用 G++ 4.7 和 clang++ 3.2。
#include <iostream>
#include <cmath>
double log(const double x) { std::cout << "log!\n"; return x; }
int main(int argc, char *argv[])
{
std::log(3.14);
return 0;
}
C++ 标准 17.6.1.2 第 4 段(强调我的):
除第 18 条至第 30 条和附录 D 中注明的情况外,每个标头的内容cname
应与相应的标头相同name.h
,如 C 标准库 (1.2) 或 C Unicode TR 中所指定(视情况而定),就像通过包含一样。然而,在 C++ 标准库中,声明(除了在 C 中定义为宏的名称)位于命名空间的命名空间范围 (3.3.6) 内std
. 未指定这些名称是否首先在全局命名空间范围内声明,然后注入命名空间std
通过显式使用声明(7.3.3)。
g++ 采用后一种方式,以便 C 和 C++ 可以重用一些相同的头文件。所以g++允许声明和定义double log(double)
在全局命名空间中。
第 17.6.4.3.3 节第 3 和第 4 段:
使用外部链接声明的标准 C 库中的每个名称都保留给实现,以用作以下名称:extern "C"
链接,都在命名空间中std
并在全局命名空间中。
使用外部链接声明的标准 C 库中的每个函数签名都保留给实现,以用作具有以下两者的函数签名:extern "C"
and extern "C++"
链接,或作为全局命名空间中的命名空间范围的名称。
第 17.6.4.3 节第 2 段顶部:
如果程序在保留名称的上下文中声明或定义名称,除非本条款明确允许,否则其行为是未定义的。
另一方面,你可能not声明或定义::log
以任何方式。
不过,遗憾的是 g++ 工具链没有给您任何错误消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)