|
Author: linqo from: linqo.cublog.cn
这样定义试试
#ifdef D #define DEBUG(s) printf("debug is %s", #s) #else #define DEBUG(s) #endif
DEBUG(abc) 相当于 printf("debug is %s", "abc")
http://blog.chinaunix.net/u/17855/showart_113663.html
内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明: ##是一个连接符号,用于把参数连在一起 例如: > #define FOO(arg) my##arg 则 > FOO(abc) 相当于 myabc #是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串 例如: > #define STRCPY(dst, src) strcpy(dst, #src) 则 > STRCPY(buff, abc) 相当于 strcpy(buff, "abc")
另外,如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开。
#define STRCPY(a, b) strcpy(a ## _p, #b) int main() { char var1_p[20]; char var2_p[30]; strcpy(var1_p, "aaaa"); strcpy(var2_p, "bbbb"); STRCPY(var1, var2); STRCPY(var2, var1); printf("var1 = %s/n", var1_p); printf("var2 = %s/n", var2_p); return 0;
/* 注意这里 */ STRCPY(STRCPY(var1,var2),var2); /* 这里是否会展开为: strcpy(strcpy(var1_p,"var2")_p,"var2“)? * 答案是否定的: * 展开结果将是: strcpy(STRCPY(var1,var2)_p,"var2") * ## 阻止了参数的宏展开! * 如果宏定义里没有用到 # 和 ##, 宏将会完全展开 */ }
============================================================================================
上面的程序有问题,改了一下
#include <stdio.h> #include <string.h>
#define STRCPY(a, b) strcpy(a##_p, b##_p) int main() { char var1,var2; char var1_p[20]; char var2_p[30]; strcpy(var1_p, "aaaa"); strcpy(var2_p, "bbbb"); // strcpy(var1_p,var2_p); STRCPY(var1, var2); STRCPY(var2, var1); printf("var1 = %s/n", var1_p); printf("var2 = %s/n", var2_p); return 0;
/* 注意这里 */ // STRCPY(STRCPY(var1,var2),var2); }
这个可以运行 |