用预处理器确定time_t的大小?

Ale*_*lke 2 c++ sizeof c-preprocessor

有没有办法知道time_t预处理器运行时的大小?

我想知道是否time_t是一个int32_t或者int64_t我想在Linux(POSIX)和Windows下工作的技巧(如果可能的话,在Mac OS/X下).它很早就喜欢它,所以我可以这样做:

#if time_t == _32BIT
typedef zint32_t my_time_t;
#else
typedef zint64_t my_time_t;
#endif
Run Code Online (Sandbox Code Playgroud)

我的zint32/64_t类型会自动初始化为零.这适用于大多数类型,但time_t在这一点上它是有问题的.除非我可以使用预处理器确定编译时的大小.

Jam*_*lis 10

没有标准宏来检测大小time_t,并且您无法在预处理期间计算类型的大小(因为在预处理期间不存在"类型").但是,您可以使用模板实现所需的结果:

#include <ctime>
#include <utility>

typedef std::conditional<
    sizeof(time_t) == 8,
    zint64_t,
    zint32_t
>::type my_time_t;
Run Code Online (Sandbox Code Playgroud)

请注意,这sizeof(time_t)是实现定义的,可能不是四个或八个字节.您需要确保通过确保在所有目标平台上它是四个或八个字节,或者通过添加额外的逻辑来处理其他大小来确定这一点.

  • 我发誓我需要停止重新发明`std :: conditional`. (7认同)