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