我有一个宏,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

07-27 13:49