宏定义:
1.数值宏常量:
宏定义可以出现在代码的任何地方。从本行宏定义开始,之后的代码就都认识这个宏了,而且也可以把任何东西定义成宏。
#define PI 3.141592654
在之后的代码可以直接使用PI来代替这一串数字,而且最好这么做,要不然当代码中有多个这串数字,而我现在要更改它的精度,这可就太麻烦了。所以只需要在宏定义中直接修改它的值就行。
#define ERROR_POWEROFF -1
还有-1这个魔鬼数,一般系统开发会定义好多错误码,如果没有定义的话,这怎么会知道-1代表的是什么。
2.字符串宏常量:
#define ENG_PATH_1 E:\English\listen_to_this\listen_to_this_3
很明显的可以看出,宏还可以来定义字符串,这样可以避免一些错误。
如果定义的字符串太长一行放不下的话可以折行,用符号“\”,但是一定要注意千万不要在折行符号后加任何字符(包括空格)。
#define ENG_PATH_3 E:\English\listen_to_this\listen\
_to_this_3
宏定义注释符号
#define BSC //
#define BMC /*
#define EMC */
BSC my single-line comment
BMC my multi-line comment EMC
注释先于预处理指令被处理,当这两行被展开成//…或/*…*/时,注释已处理完毕,此时再出现//…或/*…*/自然错误.因此,试图用宏开始或结束一段注释是不行的。
宏定义表达式
#define SQR (x) x * x
对不对?试试:假设x 的值为10,SQR (x)被替换后变成10*10。没有问题。
再试试:假设x 的值是个表达式10+1,SQR (x)被替换后变成10+1*10+1。问题来了,
这并不是我想要得到的。怎么办?括号括起来不就完了?
#define SQR (x) ((x)*(x)),所以,在宏定义表达式的时候千万别吝啬括号,稍有不慎就会出错。
#undef
#undef是用来撤销宏定义的
#define X 3
#define Y X*2
#undef X
#define X 2
int z=Y;
此时 z = 4; 在#undef之后,X的代码就不能使用了,它已经撤销了宏定义。