2009-10-06 51 views
0

,当我读了一些C++初学者的示例代码,我在TOUPPER在下面一行的用法不解:其命名空间确实TOUPPER属于

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

从上面的线,我知道, “变换”来自命名空间std,但我不知道toupper来自哪个名称空间。也许有一个C++的默认名称空间,但这只是我的猜测。那么你能解释一下toupper在我这里的用法吗?

回答

8

如果包括

<cctype> 

然后TOUPPER()是在空间std。如果包含

<ctype.h> 

then toupper()在全局命名空间中。 (在一个一切如果不是在一个特定的空间中定义的结束。一个你指的是与领先的::当你在一个特定的命名空间是。)

该规则同样适用于<cstring><string.h><cstdlib> VS <stdlib.h>

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