软讯网络 > 编程语言 > C/C++ > 宏的使用(1)
【标 题】:宏的使用(1)
【关键字】:
【来 源】:http://www.cublog.cn/u/22576/showart.php?id=156006
宏的使用(1)
宏带参数的情况:
#define FUNC_ARGS(a, b) \
void func1(void) {\
printf("%d, %d", (a), (b));\
}
用##的特殊用法:
#define FUNC(name) \
void name##Get(void) {\
printf("hello world"); \
}
##的意思是分隔连续的字符,比如我们的函数名字是 *****Get(),那么可以用上面的宏,但如果是My*****Get(),那么宏就应该这样void My##name##Get(void) {, 如果不用##分隔,写成MynameGet,那么生成的函数只能为void MynameGet();分割后,宏将把参数部分比较分割的每个部分进行替换。
FUNC(helloworld);
FUNC(worldhello);
展开后为:
void helloworldGet(void) {
printf("hello world");
}
void worldhelloGet(void) {
printf("hello world");
}
另一个#的特殊用法:
#define FUNC(arg) \
void print##arg(void) {\
printf(#arg " = %d", arg);\
}
FUNC(size); 生成代码:
void printsize(void) {
printf("size" " = %d", size );
}
我在实际工作中的应用有一个struct,比如:
struct Flags {
int iflag1;
int iflag2;
int iflag3;
} flag;
对应每一个flagN,我要写一个Get,一个Set,形如:
void ui_flag1Get(void) {
return flag.iflag1;
}
int ui_flag1Set(int iflag) {
flag.iflag1 = iflag;
}
现在我定义宏如下:
#define UI_FLAG_GETSET_DEFINE(name) \
void ui_##name##Get(void) { \
return flag.i##name;\
}\
int ui_##name##Set(int iflag) {\
flag.i##name = iflag;\
}
代码简化为:
UI_FLAG_GETSET_DEFINE(flag1);
UI_FLAG_GETSET_DEFINE(flag2);
UI_FLAG_GETSET_DEFINE(flag3);
【相关文章】
没有相关文章