#define的一些注意点:
1)#define SQR(x) printf("Thesquareof x is%d.\n",((x)*(x)));
如果这样使用宏:
SQR(8);则输出为: The squareof x is 64.
注意,引号中的字符x被当作普通文本来处理,而不被当作一个可以被替换的语言符号。假如你确实希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转化为字符串。上面的例子改一改:
#define SQR(x) printf("The squareof "#x" is%d.\n",((x)*(x)));
再使用:SQR(8); 则输出的是: The squareof 8 is 64.
2)求两个数的平方#define SQR(x) x * x
假设x的值是个表达式10+1,SQR(x)被替换后变成10+1*10+1这并不是想要得到的怎么办括起来就好了 这样 #define SQR(x) ((x)*(x))
求两个数的和:#define SUM (x)(x)+(x)而代码又写成这样:SUM (x)* SUM (x)。替换后变成:(5*3)+(5*3)*(5*3)+(5*3)。所以又错了!所以最外层的括号最好也别省了
要搞定宏定义表达式其实很简单,别吝啬括号就行了。
注意这一点:宏函数被调用时是以实参代换形参。而不是“值传送”。
3)和#运算符一样,##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号。看例子: #define XNAME(n) x##n
如果这样使用宏:XNAME(8) 则会被展开成这样: x8
##就是个粘合剂,将前后两部分粘合起来。