我不是C或C ++的老手。我不知道如何定义和设计time_t
。
几个帖子如:
但这些帖子仅说明time_t
或size_t
。它没有明确说明如何以及在何处定义和声明time_t或size_t。
我正在使用 WIN8 VS2012 Express C ++ 。我搜索了图书馆,发现在size_t
而不是crtdefs.h
中定义了cstddef
。
size_t
,time_t
等类型?我们可以让sizeof
返回unsigned int
。size_t
?size_t
或time_t
(可能它们在std
命名空间中定义)。我在图书馆再次搜索,发现size_t
定义为typedef _W64 unsigned int size_t
,_W64
定义为__w64
。在这里,我无法更多地搜索定义或声明__w64
的位置。
__w64
类型?它没有在C ++ 11 / C99标准中说明。 同样,当我搜索time_t
时,我找到__int6
。但不知道__int64
来自何处。
答案 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_t
和time_t
的定义是typedef ... size_t;
和typedef ... time_t;
- 它们在编译器中没有“修复”。标准只是说他们必须在那里(并且适合编译器所针对的系统)。我想您会发现cstddef
在某个地方或其他地方包含crtdefs.h
。
__int64
是Microsoft编译器类型。这由编译器本身定义。然后,它可用于定义其他“大小类型”,例如time_t
或size_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
就是内置的....