C中的宏 [Macro in C]

最近在学习c,话说从java转向c真的蛮痛苦。Anyway,学习就是一份好经历。

看到如下一段code:


#define APP_TOOL_OP_TYPES(f) \
f(SIMPLE, "simple", FALSE) \
f(JSON, "json", TRUE) \
f(PYTHON, "python", TRUE) \


typedef enum {
APP_TOOL_OP_INVALID,
#define DEFINE_OP_TYPE(_x, _y, _z) APP_TOOL_OP_##_x,
APP_TOOL_OP_TYPES(DEFINE_OP_TYPE)
#undef DEFINE_OP_TYPE
APP_TOOL_OP_MAX_INVALID
} APPToolOutputFmt;


在下不才一开始没理解,看了一会儿才明白,经过两次替换后,上面的枚举类型其实等价于



typedef enum {
APP_TOOL_OP_INVALID,
APP_TOOL_OP_SIMPLE,
APP_TOOL_OP_JSON,
APP_TOOL_OP_PYTHON,
APP_TOOL_OP_MAX_INVALID
}APPToolOutputFmt;



还有,为什么作者要设计成包括INVALID和MAX_INVALID两个值呢,读他后面的代码发现这在遍历这个枚举变量所有值时候特别有用,只需要一个for循环for(int a = APP_TOOL_OP_INVALID;a<APP_TOOL_OP_MAX_INVALID;a++)就可以了!(注意c里面枚举缺省从0开始赋值。)

还有,关于两个#和一个#在宏里面分别表示什么意思呢?
两个#表示连接,比如,APP_TOOL_OP_##_x表示APP_TOOL_OP_和参数SIMPLE连接成APP_TOOL_OP_SIMPLE。具体见
http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html#Concatenation

一个#表示取字符串,比如#APP就是表示取“APP”这个字符串,详见
http://gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值