哪些 C++ 编译器自动定义 size_t 而无需 header 包含?
Which C++ compilers automatically define size_t without requiring a header include?
在使用 Visual Studio 2013 的 C++ 编译器时,我注意到我的代码依赖 size_t 正确编译,即使不包含任何 headers 定义它(即 #include <stddef.h>
或 #include <string.h>
)。
我测试了这个,因为我有点喜欢不包括整个 header 的想法,只是为了像这样的微不足道的事情;我觉得它使我的代码膨胀。我的结论是 Visual Studio 2013 的 C++ 编译器自动定义了 size_t
,即使代码中没有任何 header 包含。
在享受这个的同时,我开始担心便携性。编码方便,感觉我的代码很优雅,对我来说比绝对可移植性更重要;但我仍然想要一些 可移植性。例如,我不介意使用 #pragma once
因为大多数编译器都支持它并且 header 守卫很麻烦(尤其是在 Visual Studio 中),但我绝不会仅仅因为导出模板一位编译器支持它。
所以,我的问题是,size_t 的自动定义是许多编译器提供的广泛功能,还是特定于 Microsoft 的编译器?
这种行为当然不普遍; GCC 和 Clang 都要求为 std::size_t
包含 <cstddef>
,或者为 ::size_t
包含已弃用的 <stddef.h>
,正如标准所指定的那样。
Neither gcc nor clang contain a similar violation of the C++ standard.
在 3 之间,MSVC gcc 和 clang 是绝大多数编译器。
icc 13.0.1也是如此。
我没试过ECG,请自便。
在使用 Visual Studio 2013 的 C++ 编译器时,我注意到我的代码依赖 size_t 正确编译,即使不包含任何 headers 定义它(即 #include <stddef.h>
或 #include <string.h>
)。
我测试了这个,因为我有点喜欢不包括整个 header 的想法,只是为了像这样的微不足道的事情;我觉得它使我的代码膨胀。我的结论是 Visual Studio 2013 的 C++ 编译器自动定义了 size_t
,即使代码中没有任何 header 包含。
在享受这个的同时,我开始担心便携性。编码方便,感觉我的代码很优雅,对我来说比绝对可移植性更重要;但我仍然想要一些 可移植性。例如,我不介意使用 #pragma once
因为大多数编译器都支持它并且 header 守卫很麻烦(尤其是在 Visual Studio 中),但我绝不会仅仅因为导出模板一位编译器支持它。
所以,我的问题是,size_t 的自动定义是许多编译器提供的广泛功能,还是特定于 Microsoft 的编译器?
这种行为当然不普遍; GCC 和 Clang 都要求为 std::size_t
包含 <cstddef>
,或者为 ::size_t
包含已弃用的 <stddef.h>
,正如标准所指定的那样。
Neither gcc nor clang contain a similar violation of the C++ standard.
在 3 之间,MSVC gcc 和 clang 是绝大多数编译器。
icc 13.0.1也是如此。
我没试过ECG,请自便。