我定义了以下数据类型:
typedef int MyInt;
然后我希望根据 MyInt 的大小定义一个新的数据类型,类似于下面的代码,但我找不到解决方案。
#if sizeof(MyInt) == 2
typedef long MyLong;
#else
typedef short MyLong;
#endif
有人可以帮忙吗?
我定义了以下数据类型:
typedef int MyInt;
然后我希望根据 MyInt 的大小定义一个新的数据类型,类似于下面的代码,但我找不到解决方案。
#if sizeof(MyInt) == 2
typedef long MyLong;
#else
typedef short MyLong;
#endif
有人可以帮忙吗?
评估不是预处理器的工作sizeof
,这是由编译器完成的,这是该过程的后期阶段。评估sizeof
需要深入的 C 知识,而预处理器根本没有。
您可以(理论上)将预处理器视为一个单独的步骤,它只进行文本转换,实际上将“foo.c”转换为“foo-preprocessed.c”。后一个文件不会留下任何#include
or #if
s,它们都被预处理器评估和替换。实际的编译器永远不会看到它们。
您应该考虑使用<stdint.h>
已知精度类型(uint16_t
和朋友)。
您可以使用宏的值UINT_MAX
来确定基础类型的大小。
您可以使用UINT_MAX
- 它可以为您提供有关整数大小的线索。
#if (UINT_MAX <= 65536)
typedef long MyLong;
#else
typedef short MyLong;
#endif
足够新的 GCC(我认为是 4.3)具有预定义的标识符,例如__SIZEOF_LONG__
,但limits.h
按照其他人的建议使用常量更简单。
尽管我和 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