目录
预处理
宏定义
3.1.1 数值宏常量
3.1.2 字符串宏常量
3.1.3 用宏定义充当注释符号
3.1.4 预处理,编译,汇编,链接的总结
3.1.5 去注释和宏替换谁先谁后?
3.1.6 用 define 宏定义表达式
3.1.7 宏定义中的空格
3.1.8 #undef
3.1.8.1 先探讨2个问题
3.1.8.2 undef本质作用
3.1.8.3 注意!这个是可以使用的
本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始!
预处理 宏定义 3.1.1 数值宏常量谁都不能阻挡你成为更优秀的人。
#define PI 3.1415926
3.1.2 字符串宏常量作用:1.好改(用了多次,可维护性) 2.赋有意义
#include#include //#define PATH1 C:UserswhbDesktop //#define PATH1 "C:\Users\whb\Desktop //#define PATH1 C:\Users\whb\Desktop #define PATH1 "C:\Users\whb\Desktop"
3.1.3 用宏定义充当注释符号结论:宏定义代表字符串的时候,一定要带上双引号,可以用续行 。
// 程序翻译过程: // 预处理 -E :头文件展开,去注释,宏替换 // 编译 -S : 将干净的 C 语言,编译成为汇编语言 // 汇编 -c :将汇编翻译成为目标二进制文件 // 链接 :将目标二进制文件与相关库链接,形成可执行程序
示例一:
结论:在预处理后,注释直接变为空格。
示例二:
结论:宏在预处理后直接替换掉为宏的定义。
示例三:
PS:这里是 .i 如果是 .c 就会再次进行预处理 。
结论:编译就是把原来的代码编译为汇编语言。
示例四:
其实是不可显示,本质上已经是二进制了。
3.1.4 预处理,编译,汇编,链接的总结链接:自身程序+库文件进行关联(动,静态链接),形成可执行程序。
3.1.5 去注释和宏替换谁先谁后?这里有一个小技巧,我们键盘左上角有一个Esc,这就刚好对应我们的前三步,预处理(E),编译(S),链接(c),只有链接是小写哈。
结论:预处理期间,先执行去注释,在进行宏替换
3.1.6 用 define 宏定义表达式例一:
其实是把sum(10)直接转化为了宏定义的式子,同时x=10,就变成了右边的样子。
例二:
PS:上面是加上 ; 不是 : 之前写错了。
例三:
这是错的哈!因为 if 和 else 是对不上的,原因就是if后面没有 { } 括起来。
这里相较于上面我们进行了 { } 的优化发现就对了。
但是:如果我们不准给if带{}呢?
来看看下面的代码:
这样我们就可以不用带 { } 了,并且后面可以跟 “ ; ” 。
结论:当我们需要宏进行多语句替换的时候, 推荐使用do-while-zero结构。当然,如若可以,宏方面的东西,推荐少用。3.1.7 宏定义中的空格
[whb@VM-0-3-centos code]$ cat test.c #include3.1.8 #undef 3.1.8.1 先探讨2个问题#define INC(a) ((a)++) //定义不能带空格 int main() { int i = 0; INC (i); //使用可以带空格,但是严重不推荐 printf("%dn", i); }
1. 宏只能在 main 上面定义吗? 2. 在一个源文件内,宏的有效范围是什么 ?
问题一:
结论:经过测试,宏,在哪都可以,习惯放在最上面。
问题二:
3.1.8.2 undef本质作用结论:宏的作用范围是从定义处开始,往后都是有效的。注意!程序是从上往下走的,是只要宏定义在上面,下面就能用是这个意思哈!
结论:undef是取消宏的意思,可以用来限定宏的有效范围。
3.1.8.3 注意!这个是可以使用的是4哈!这个应该是好理解的,上面的定义3被取消了,是使用的下面的2。
今天的内容就到这里了哈!!!
要是认为作者有一点帮助你的话!
就来一个点赞加关注吧!!!当然订阅是更是求之不得!
最后的最后谢谢大家的观看!!!
你们的支持是作者写作的最大动力!!!
下期见哈!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)