当我正在为初学者阅读一些c ++示例代码时,我对以下行中toupper的使用感到困惑:
std::transform(data.begin(), data.end(), data.begin(), ::toupper);
Run Code Online (Sandbox Code Playgroud)
从上面这一行,我知道"transform"来自命名空间std,但我不知道toupper来自哪个命名空间.也许有一个c ++的默认命名空间,但这只是我的猜测.所以你能解释一下toupper在我身上的用法吗?
Dev*_*lar 10
如果你包括
<cctype>
Run Code Online (Sandbox Code Playgroud)
然后toupper()在命名空间std中.如果你包括
<ctype.h>
Run Code Online (Sandbox Code Playgroud)
然后toupper()在全局命名空间中.(如果没有在特定的命名空间中定义,那么一切都会结束.::当你在特定的命名空间中时,你引用的那个.)
同样的规则适用于<cstring>vs. <string.h>,<cstdlib>vs <stdlib.h>.等.
如果您对:: 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)
}
}
Run Code Online (Sandbox Code Playgroud)