#是生成字符串:
#define a(x) #x
a(bc) => "bc"
##是连接:
#define a(x) abc##x
a(123) => abc123
#error是生成编译错误消息:
#ifdef abc
#error something wrong...
#endif
//如果abc是已经定义的宏,那么编译的时候就会显示错误消息something wrong...
//////////////////////////////////////////////////////////////////////
“标准”宏定义一个MIN 输入两参数输出其中最小的
#define MIN(A,B) ((A)<= (B) ? (A) : (B) )
这种定义会带来一些副作用,看下面的例子:
int x = 1, y = 2;
int main()
{
printf("min=%d\n", min(x++, y++));
printf("x = %d, y = %d\n", x, y);
}
执行完min(x++、y++),我们期望x的值为2,y的值为3。
但是,实际的结果是,执行完mini(x++、y++)后,x的值为3,y的值为3,原因在于宏展开后x++被执行了两次。但暂时没找到其它更好的办法。
#define a(x) #x
a(bc) => "bc"
##是连接:
#define a(x) abc##x
a(123) => abc123
#error是生成编译错误消息:
#ifdef abc
#error something wrong...
#endif
//如果abc是已经定义的宏,那么编译的时候就会显示错误消息something wrong...
//////////////////////////////////////////////////////////////////////
“标准”宏定义一个MIN 输入两参数输出其中最小的
#define MIN(A,B) ((A)<= (B) ? (A) : (B) )
这种定义会带来一些副作用,看下面的例子:
int x = 1, y = 2;
int main()
{
printf("min=%d\n", min(x++, y++));
printf("x = %d, y = %d\n", x, y);
}
执行完min(x++、y++),我们期望x的值为2,y的值为3。
但是,实际的结果是,执行完mini(x++、y++)后,x的值为3,y的值为3,原因在于宏展开后x++被执行了两次。但暂时没找到其它更好的办法。