size_t和__w64,time_t和__int64如何工作?

时间:2013-06-22 08:04:39

标签: c++ size-t int64

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

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

我正在使用 WIN8 VS2012 Express C ++ 。我搜索了图书馆,发现在size_t而不是crtdefs.h中定义了cstddef

  • 为什么需要size_ttime_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来自何处。

2 个答案:

答案 0 :(得分:2)

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

size_t s;
...
unsigned int i;

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

size_ttime_t的定义是typedef ... size_t;typedef ... time_t; - 它们在编译器中没有“修复”。标准只是说他们必须在那里(并且适合编译器所针对的系统)。我想您会发现cstddef在某个地方或其他地方包含crtdefs.h

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

答案 1 :(得分:0)

C / C ++有20多年的历史,现在可能已经实现了100多个不同的架构。

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

是的,在这种情况下int/unsigned int是16位,这是有道理的,而指针和size_t是32位。在x86上,情况并非如此,但很好......

这就是答案。

  

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

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