似乎在XCode上我需要在Visual C ++上使用std :: size_t而不是size_t。但这是一个痛苦,因为我真的不想拥有#include <cstddef>
并将我的代码中的每个size_t
更改为std::size_t
...在我的Windows代码size_t
中工作时不包含任何其他文件。
有没有办法让我现有的代码在XCode中运行(可能通过.pch文件?)或GCC / MSVC ++在这方面根本不同,我的代码需要使用std::size_t
才能成为跨平台?
答案 0 :(得分:7)
根据C ++ 03标准,17.4.1.2.4:
除第18至27条所述外,每个标题cname的内容应与ISO / IEC 9899:1990编程语言C(第7条)中规定的相应标题名称h的内容相同,或者ISO / IEC:1990编程语言-C修正案1:C完整性,(第7条),视情况而定。但是,在C ++标准库中,声明和定义(除了在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内。
换句话说,通过选择使用<cstddef>
而不是<stddef.h>
,您特别要求类型size_t在命名空间std中。
所以,以下是选择:
请改用<stddef.h>
,因此size_t
位于顶级命名空间中,如Jesse Good所建议。
使用<cstddef>
并使用std::size_t
。
使用<cstddef>
并使用using声明将size_t
拉入顶级命名空间,如cnicutar所示。
当然,你可以依赖这样一个事实:一个特定版本的一个编译器/库/平台可以让你逃脱它,或为每个平台编写不同的代码,或用autoconf包装整个事件,或者编写一个代码生成器或基于sed的预处理器,或者其他......但为什么?
答案 1 :(得分:6)
也许在靠近顶部的地方说这个?
using std::size_t;
答案 2 :(得分:4)
使用#include <stddef.h>
。
那么,#include <stddef.h>
和#include <cstddef>
之间有什么区别?
<cstddef>
是一个C ++标头,保证在std
命名空间中定义所有符号,并且可以定义全局命名空间中的内容。
<stddef.h>
是一个C头,保证定义全局命名空间中的所有符号,可以定义std
命名空间中的内容。
因此,正如您在Visual Studio上所说,可以使用size_t
,因为它会为您注入size_t
全局命名空间(可能已包含“stddef.h”)。如果您希望在任何编译器上使用stddef.h
。
(但是,作为纯C ++粉丝,我个人更喜欢std::size_t
)。