toupper属于哪个命名空间

时间:2009-10-06 06:21:54

标签: c++ namespaces

当我正在为初学者阅读一些c ++示例代码时,我对以下行中toupper的使用感到困惑:

std::transform(data.begin(), data.end(), data.begin(), ::toupper);

从上面这一行,我知道“transform”来自命名空间std,但我不知道toupper来自哪个命名空间。也许有一个c ++的默认命名空间但是 这只是我的猜测。你能解释一下toupper在我身上的用法吗?

2 个答案:

答案 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)
   }
}