2017-05-31 112 views
1

我注意到我的C++程序编译得很好,无论我使用::size_t还是std::size_t。我可以交换使用它们,根本没有任何问题,所以看起来像其中一个是typedef为什么在全局范围和命名空间std中定义了size_t?

举个例子,考虑下面的代码,它使用全球size_t(这是整个文件,没有using S和其他的东西):

#include <iostream> 
int main() { 
    ::size_t x = 100; 
    std::cout << x << std::endl; 
} 

下一个代码使用size_tstd

#include <iostream> 
int main() { 
    std::size_t x = 100; 
    std::cout << x << std::endl; 
} 

如预期的那样编译正常并输出100

我的印象是标准库中的所有东西都放在命名空间std中,但显然情况并非如此。这是为什么?

注意:ptrdiff_t,intN_tuintN_t也是如此。

+0

也许模糊,如果不是有趣的读取:https://stackoverflow.com/questions/237370/does-stdsize-t-make-sense-in-c和https://stackoverflow.com/questions/42797279/what -to-do-with-size-t-vs-stdsize-t – Tas

+0

@Tas现在我还有一个问题。如果我删除'#include '并添加'#include ',则不会定义':: size_t'。所以看起来'#include '在内部'#include ',至少在GCC上。 – Bernard

+0

@Bernard,C++标准没有对任何标准库头中包含的附加头进行限制。所以,海湾合作委员会的行为是不符合标准 – WhiZTiM

回答

-1

据我所知,::size_tstd::size_t略有不同,但基本相同,具有类似的功能。

有一个更好的答案在这里:link

希望这有助于!