4

我不是 C 或 C++ 方面的老手。我不知道如何time_t定义和设计。几个帖子,如:

但这些帖子只说明什么是time_tsize_t。它没有明确说明 time_t 或 size_t 是如何以及在何处定义和声明的。

我正在使用WIN8 VS2012 Express C++。我搜索了库,发现它size_t是在crtdefs.h而不是cstddef.

  • 为什么需要像size_t,之类的类型time_t?我们可以让sizeof只是返回unsigned int
  • 为什么 C++ 库没有定义size_t
  • 我可以说 size_t不是C/C++ 内置类型吗?
  • 我永远不需要在我的程序中包含相应的头文件来使用size_ttime_t(也许它们是在std命名空间中定义的)。

我在库中再次搜索,发现size_t定义为typedef _W64 unsigned int size_t_W64定义为__w64。在这里,我无法更多地搜索__w64定义或声明的位置。

  • 什么是__w64类型?C++11/C99 标准中没有说明。

同样,当我搜索 时time_t,我发现__int6. 却不知从何__int64而来。

4

2 回答 2

2

__w64是 Microsoft 特定的扩展,它“在使用 /Wp64 编译时启用警告” - 如果您尝试将其编译为 64 位,它用于识别“危险”的代码 - 例如,将 64 位值分配给32 位一个。例如:

size_t s;
...
unsigned int i;

...
i = s;    // 32 bit can't take all 64 bit values - possible problem. 

和的定义是size_t和- 它们在编译器中不是“固定的”。标准只是说它们必须在那里(并且适合编译器目标的系统)。我想你会发现它包含在某个地方或另一个地方。time_ttypedef ... size_t;typedef ... time_t;cstddefcrtdefs.h

__int64Microsoft 编译器类型。这是由编译器自己定义的。然后可以使用它来定义其他“大小类型”,例如time_tsize_t(根据需要使用合适unsigned的)。其他编译器可能没有这种类型,但会有一些方法来定义 8、16、32 和 64 位整数。的实际起源__int64可能在 的起源之前long long,很长一段时间(双关语)微软不支持它。我相信现在是。

于 2013-06-22T08:17:46.797 回答
0

C/C++ 有 20 多年的历史,现在可能在 100 多种不同的架构上实现。

事实上,其中一些确实与 x86 不同。其中一些整数寄存器是 16 位的,而地址空间和地址寄存器是 32 位的。我有在这些环境中写作的经验。

是的,在这种情况下int/unsigned int是 16 位,这是有道理的,而指针和 size_t 是 32 位。在 x86 上不是这样,但是...

这就是答案。

size_t 不是 C/C++ 内置类型?

真正的答案是肯定的和否定的。理论上,您可以编写自己的头文件,例如crtdefs.h. 并在那里写任何你想要的。编译器很可能会工作。但这是很多工作。没有人这样做。一旦系统头文件成为编译器的一部分,那么 size_t就内置了......

于 2013-06-22T08:17:24.703 回答