0

我定义了以下数据类型:

typedef int MyInt;

然后我希望根据 MyInt 的大小定义一个新的数据类型,类似于下面的代码,但我找不到解决方案。

#if sizeof(MyInt) == 2
    typedef long MyLong;
#else
    typedef short MyLong;
#endif

有人可以帮忙吗?

4

5 回答 5

5

评估不是预处理器的工作sizeof,这是由编译器完成的,这是该过程的后期阶段。评估sizeof需要深入的 C 知识,而预处理器根本没有。

您可以(理论上)将预处理器视为一个单独的步骤,它只进行文本转换,实际上将“foo.c”转换为“foo-preprocessed.c”。后一个文件不会留下任何#includeor #ifs,它们都被预处理器评估和替换。实际的编译器永远不会看到它们。

您应该考虑使用<stdint.h>已知精度​​类型(uint16_t和朋友)。

于 2012-12-07T10:11:19.287 回答
4

您可以使用宏的值UINT_MAX来确定基础类型的大小。

于 2012-12-07T10:09:15.417 回答
1

您可以使用UINT_MAX- 它可以为您提供有关整数大小的线索。

#if (UINT_MAX <= 65536)
    typedef long MyLong;
#else
    typedef short MyLong;
#endif
于 2012-12-07T10:09:58.037 回答
0

足够新的 GCC(我认为是 4.3)具有预定义的标识符,例如__SIZEOF_LONG__,但limits.h按照其他人的建议使用常量更简单。

于 2012-12-07T11:08:05.327 回答
0

尽管我和 C 预处理器是不共戴天的敌人,但我们有时需要彼此 ;)。所以我建议:

#if SIZEOF_MYINT == 2
#   define MYLONG_T long
#elif SIZEOF_MYINT == 4
#   define MYLONG_T short
#endif

typedef MYLONG_T MyLong;

在其他地方(在全局配置头文件中)你有你的架构依赖

#define SIZEOF_MYINT 2
于 2012-12-07T12:04:31.643 回答