3

在 XCode 上似乎我需要在 Visual C++ 上使用 std::size_t 而不是 size_t 。但这很痛苦,因为我真的不想在我的代码中#include <cstddef>更改每个size_tto std::size_t......在我的 Windows 代码中size_t无需包含任何其他文件即可正常工作。

有没有办法让我现有的代码在 XCode 中工作(可能通过 .pch 文件?)或者 GCC/MSVC++ 在这方面根本不同,我的代码需要使用std::size_t才能跨平台?

4

3 回答 3

7

根据 C++03 标准,17.4.1.2.4:

除了第 18 到 27 节中的说明外,每个头文件 cname 的内容应与相应头文件 name.h 的内容相同,如 ISO/IEC 9899:1990 编程语言 C(第 7 条)或 ISO/IEC 中规定的:1990 编程语言—C 修正案 1:C 完整性,(第 7 条),视情况而定,如同包含在内。然而,在 C++ 标准库中,声明和定义(在 C 中定义为宏的名称除外)在命名空间 std 的命名空间范围 (3.3.5) 内。

换句话说,通过选择使用<cstddef>而不是<stddef.h>,您明确要求类型 size_t 在命名空间 std 内。

所以,这里有选择:

  1. <stddef.h>正如 Jesse Good 所建议的那样size_t,在顶级命名空间中使用。

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

  3. 按照 cnicutar 的建议,使用<cstddef>和使用 using 声明来拉size_t入顶级命名空间。

当然,您可以依赖这样一个事实,即一个编译器/库/平台的一个特定版本可以让您摆脱它,或者为每个平台编写不同的代码,或者用 autoconf 包装整个事情,或者编写代码生成器或 sed - 基于预处理器,或其他什么......但为什么呢?

于 2012-05-30T21:24:20.783 回答
6

也许在靠近顶部的某个地方这么说?

using std::size_t;
于 2012-05-30T20:38:11.357 回答
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)。

于 2012-05-30T21:23:49.273 回答