当我正在为初学者阅读一些c ++示例代码时,我对以下行中toupper的使用感到困惑:
std::transform(data.begin(), data.end(), data.begin(), ::toupper);
从上面这一行,我知道“transform”来自命名空间std,但我不知道toupper来自哪个命名空间。也许有一个c ++的默认命名空间但是 这只是我的猜测。你能解释一下toupper在我身上的用法吗?
答案 0 :(得分:8)
如果你包括
<cctype>
然后toupper()在命名空间std中。如果你包括
<ctype.h>
然后toupper()在全局命名空间中。 (如果未在特定命名空间中定义,则所有内容都会结束。当您位于特定命名空间时,您使用前导::
引用的那个。)
同样的规则适用于<cstring>
与<string.h>
,<cstdlib>
与<stdlib.h>
等。
答案 1 :(得分:4)
如果您对:: toupper语法感到困惑,它告诉您在这种情况下,该函数位于全局命名空间中。您始终可以在名称前面添加一个双冒号,这将告诉编译器检入全局命名空间,而不是从内部命名空间中搜索。
void foo() { std::cout << "global"; }
namespace inner {
void foo() { std::cout << "inner"; }
void call() {
foo(); // prints inner
::foo(); // prints global
::inner::foo(); // prints inner (fully qualified namespace)
}
}