最近在学习c,话说从java转向c真的蛮痛苦。Anyway,学习就是一份好经历。
看到如下一段code:
在下不才一开始没理解,看了一会儿才明白,经过两次替换后,上面的枚举类型其实等价于
还有,为什么作者要设计成包括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
看到如下一段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