我有一个宏,WW
,字的宽度以位为单位,比如
#define WW 64
我想声明一个新类型
foo_t
,作为uintX_t
中<stdint.h>
的别名。我可以硬编码宽度和使用#define uint(x) typedef uint ## x ## _t foo_t
uint(64);
然而,
uint(WW)
显然是个错误。我用了一段时间像#define expand(x) x
这样的宏,并以各种方式使用它,但没有效果。我的最后一个办法是级联#if WW == 64
typedef uint64_t foo_t;
#elif WW == 32
typedef uint32_t foo_t;
#elif WW == 16
typedef uint16_t foo_t;
#elif WW == 8
typedef uint8_t foo_t;
#else
#error "unsupported word width"
#endif
我宁愿避免。有没有办法根据我的
#if
宏定义一个类型,以便WW
最终扩展到uint(WW)
?我相信答案是“不”,但一些语言律师请证明我错了。 最佳答案
由于宏扩展的工作方式,您需要额外的间接级别:
#define maketype(x) uint ## x ## _t
#define uint(x) typedef maketype(x) foo_t
Live example