宏
首先宏的使用:
有标准宏和宏函数
标准宏就是将一个大写字母或单词定义成不可改变的常量,使用时直接文本替换,如:
#define N 1000
宏函数是将一个函数简化为大写的字母或单词,多次使用时会很方便。要注意的是宏函数里边,表达式和参数都要带上圆括号,否则可能会出现由于优先级或求值顺序而导致的bug,比如:
假设:x=2+3 #define M(x) x*x 则此时输出结果为2+3*2+3=11 #define M(x) (x)*(x) 输出结果为(2+3)*(2+3)=25 #define A(x) (x)+(x) int result=10*A(x) 此时输出结果为10*(2+3)+(2+3)=55 #define A(x) ((x)+(x)) 此时输出结果为10*((2+3)+(2+3))=100
所以在定义宏函数时一定要给表达式和参数都加上圆括号。
#
可以用来将宏参数变成对应的字符串,如:
#define TEST(FORMAT,VALUE) print("the val of "#VALUE" is "FORMAT"\n",VALUE) int i=10; TEST("%d",i+3); //#VALUE被预处理成为 i+3 输出结果是:the val of i+3 if 13
##
可以把##两边的符号合成为一个符号,但合成后的符号必须是合法的标识符。
#define ADD(n,value) sum##n+=value; ADD(6,9); 输出为:sum6+=9;
宏和函数
宏的优势: 对于小型计算,宏在规模和速度方面比函数有优势。
宏的参数是和类型无关的,但这既是它的优势也是它的劣势。
宏的参数可以是类型,也可以是另外一个宏的参数。
劣势: 宏是不能调试的。
参数与类型无关,所以不够严谨。
由于调用宏时是文本替换,所以多次调用的话可能会大幅增加程序长度。
函数的优势: 每次调用你都是调用同一个地方的代码。
参数的辅佐用不会导致多次求值引发的错误,且结果容易预测。
劣势: 函数调用和返回时会有额外开销
相对与宏,函数的速度稍慢。