【发布时间】:2017-05-31 04:03:20
【问题描述】:
我注意到无论我使用::size_t 还是std::size_t,我的C++ 程序都能正常编译。我可以毫无问题地互换使用它们,因此其中一个似乎是另一个 typedef。
例如,考虑以下使用全局 size_t 的代码(这是整个文件,没有 usings 和其他内容):
#include <iostream>
int main() {
::size_t x = 100;
std::cout << x << std::endl;
}
下一个代码在std中使用size_t:
#include <iostream>
int main() {
std::size_t x = 100;
std::cout << x << std::endl;
}
编译正常并按预期输出100。
我的印象是标准库中的所有内容都放在命名空间std 中,但显然情况并非如此。为什么会这样?
注意:ptrdiff_t、intN_t 和 uintN_t 也是如此。
【问题讨论】:
-
也许是骗子,如果不是很有趣,请阅读:stackoverflow.com/questions/237370/… 和 stackoverflow.com/questions/42797279/…
-
@Tas 现在我还有一个问题。如果我删除
#include <iostream>并添加#include <cstddef>,则不会定义::size_t。所以看起来#include <iostream>内部是#include <stddef.h>,至少在 GCC 上是这样。 -
@Bernard,C++ 标准没有限制任何标准库头文件中包含的附加头文件。所以,GCC 的这种行为并不符合标准
-
副本是相关的,但似乎并没有真正回答这个问题
-
@WhiZTiM 这让我很惊讶。很多人说只要不
using namespace std;,就不会和标准库中的名字发生冲突。
标签: c++ namespaces std c++-standard-library size-t