toupper属于哪个命名空间

Hai*_*ang 2 c++ namespaces

当我正在为初学者阅读一些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>.等.


Dav*_*eas 5

如果您对:: 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)