学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。
实验1 : 宏是被预处理器所处理的,预处理器只进行简单的文本替换,不会进行语法检测
实验2 : 宏表达式的强大和易出错
实验3:宏的作用域,对于宏而言 是没有作用域限制的,作用域的概念是针对C语言里面的变量和函数的,不针对宏。因为宏是被预处理器处理的,编译器根本不知道宏标识符的存在,所以编译器根本无法将作用域的概念应用于宏!
实验4: 强大的内置宏

‘
define 定义出来的宏常量本质是字面量,也就是说 不占用任何的内存空间。
实验1 : 宏是被预处理器所处理的,预处理器只进行简单的文本替换,不会进行语法检测
#define ERROR -1
#define PATH1 "D:\test\test.c"
#define PATH2 D:\test\test.c //error
#define PATH3 D:\test\ //error // 宏中的接续符
test.c
int main()
{
int err = ERROR;
char* p1 = PATH1;
char* p2 = PATH2;
char* p3 = PATH3;
}
宏是被预处理器所处理的,因此我们判断这几个宏定义的对不对就需要看预处理器出来的结果是否正确,
gcc -E 21-1.c -o 21-1.i 预处理成功,并没有报错。所以预处理器是直接进行文本替换,是不会进行语法检查的,语法检查是由后面的编译器做的工作。编译直接报错。
# 1 "21-1.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "21-1.c"
int main()
{
int err = -1;
char* p1 = "D:\test\test.c";
char* p2 = D:\test\test.c;
char* p3 = D:\testtest.c;
}
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$
mhr@ubuntu:~/work/C$ gcc -E 21-1.c -o 21-1.i
mhr@ubuntu:~/work/C$ ll
total 28
drwxrwxr-x 2 mhr mhr 4096 Jan 11 19:23 ./
drwxrwxr-x 4 mhr mhr 4096 Dec 15 03

最低0.47元/天 解锁文章
4375

被折叠的 条评论
为什么被折叠?



