XCode上的size_t

时间:2012-05-30 20:36:43

标签: c++ xcode visual-c++ gcc stl

似乎在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才能成为跨平台?

3 个答案:

答案 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中。

所以,以下是选择:

  1. 请改用<stddef.h>,因此size_t位于顶级命名空间中,如Jesse Good所建议。

  2. 使用<cstddef>并使用std::size_t

  3. 使用<cstddef>并使用using声明将size_t拉入顶级命名空间,如cnicutar所示。

  4. 当然,你可以依赖这样一个事实:一个特定版本的一个编译器/库/平台可以让你逃脱它,或为每个平台编写不同的代码,或用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)。