C语言符号和参数详解.docx
文本预览下载声明
1..数值宏常量
它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了;也可以把任何东西定义成宏。
因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙。看例子:???#define?PI?3.141592654
const修饰的数据是有类型的,而define宏定义的数据没有类型。为了安全,我建议你以后在定义一些宏常数的时候用const代替,
编译器会给const修饰的只读变量做类型校验,减少错误的可能。但一定要注意const修饰的不是常量而是read only的变量
const修饰的只读变量不能用来作为定义数组的维数也不能放在case关键字后面。
2..?字符串宏常量
A),#define??ENG_PATH_1????E:\English\listen_to_this\listen_to_this_3
B),#define???ENG_PATH_2????“E:\English\listen_to_this\listen_to_this_3”
ENG_PATH_1加上双引号就成了:“ENG_PATH_1”。
3..?用define宏定义注释符号可以吗
#define??BSC???//???????
?#define??BMC??/*????
#define??EMC??*/
D),BSC?my single-linecomment
E),BMC?my multi-linecomment??EMC
D)和E)都错误,为什么呢?因为注释先于预处理指令被处理,当这两行被展开成//…或/*…*/时,注释已处理完毕
此时再出现//…或/*…*/自然错误.因此,试图用宏开始或结束一段注释是不行的。(上机调试可知)
?4..?用define宏定义表达式
求两个数的平方#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)。所以又错了!所以最外层的括号最好也别省了
要搞定宏定义表达式其实很简单,别吝啬括号就行了。
注意这一点:宏函数被调用时是以实参代换形参。而不是“值传送”。
5..?宏定义中的空格
#define SUM?? (x)(x)+(x)?? SUM??后边有一个空格
这还是定义的宏函数SUM(x)吗?显然不是。编译器认为这是定义了一个宏:SUM,其代表的是(x)(x)+(x)。
其关键原因还是在于SUM后面的这个空格.这个空格仅仅在定义的时候有效,在使用这个宏函数的时候,空格会被???译器忽略掉。
也就是说,定义好的宏函数SUM(x)在使用的时候在SUM和(x)之间留有空格是没问题的。比如:SUM(3)和SUM????????(3)的是一样的。
?6..#undef
#undef是用来撤销宏定义的,用法如下:
#define PI 3.141592654
// code
#undef PI
//下面的代码就不能用PI了,它已经被撤销了宏定义。
也就是说宏的生命周期从#define开始到#undef结束
#define X 3
#define Y X*2
#undef X
#define X 2
int z=Y;??
z = 4.? 预处理的时候 X是等于2的? X等于3已经被撤销
7..#error预处理
#error预处理指令的作用是,编译程序时,只要遇到#error就会生成一个编译错误提
示消息,并停止编译。其语法格式为:#error???error-message例:
#define ABC
?
#ifdef??ABC
#error C++ compiler required.??输出C++ compiler required.
#else
?
#endif
注意,宏串error-message不用双引号包围。遇到#error指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。
关于系统所支持的error-message信息,可以查找相关资料
8..#line预处理
#line的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符
命令的基本形式如下:
#line??number[filename]
其中[]内的文件名可以省略。例如:
?#line 55 a.h
int main()????
{???
????printf(%d\n, __LINE__);?????????????????????????????
显示全部