预处理:1.编辑 2.编译 3运行4调试
编译过程:
1.预处理(预编译):将代码中相关的预处理指令执行,最终生成一个只包含C语言的程序。指令为:gcc -E file.c -o file.i.将源程序中预处理指令翻译为c语言程序。
1.宏定义:
语法:#define 标识符 字符串。
#define 宏名 宏值。
注意:预处理命令都是以#开头
宏名 命名规则和之前标识符命名规则一致。
宏名的定义建议写成大写,与区别普通变量。
预处理实际上是将宏名用宏值原样替换。(文本替换)c语言字符串中出现的“”宏名“不会被替换。
宏名的作用域:从定义开始到#undef结束。
#undef 宏名:表示取消宏名的作用。
应用:1.提高代码可读性。2一改全改,方便代码修改。
2.带参宏定义:(又叫宏函数,但是与函数不同)
语法:#define 宏名(参数) 宏值
eg;#define ADD(a,b) a+b;
注意:1.带参宏和函数有本质的区别
1.处理阶段不一样:宏定义----预处理阶段;函数----编译阶段。
宏的参数,只是进行文本替换,不进行语法检查。函数的参数是有类型的,编译阶段要进行类型检查。
2.使用不一样: 宏---预处理阶段使用结束;函数-----调用时,进行使用。
3.应用:对于短小代码,考虑写成带参宏。
宏的副作用:因为原样替换,可能会有运算优先级的改变,导致结果出差错。
处理:把能加括号的地方都加上括号。
2.宏定义必须写在一行。 \ 是续航符,可以进行多行书写,但是 \后面不能又空格。
2.文件包含:
#include<文件名>
#include"文件名"
区别:在于在查找头文件的方式不一样,<>到系统默认的路径寻找对应的头文件,”“表示先到当下目录下寻找头文件,如果没有,再到系统默认路径寻找。
3.条件编译:
#if 标识符
程序段1
#else
程序段2
#endif
用途:调试代码。设计头文件。
#ifndef......
#if 表达式 程序段1 #else 程序段2 #endif:含义:表达式为真,处理程序段1,为假,处理程序段2
2.编译:指令:gcc -S file.i -o file.s.将预处理后的程序翻译成汇编语言程序语言。
3.汇编:指令:gcc -o file.s -o file.o.将汇编程序翻译成二进制文件。
4.链接:指令:gcc file.o -o file.将使用到的其他代码链接到一起生成最终的可执行文件。
指针:
1.指针的概念:指针就是地址,地址就是内存单元的编号
2.指针也是一种数据类型,它是专门用来存放地址这种数据的。
3.语法:基类型 * 指针变量名。
4指针变量的引用:*运算符。可以取得指向对应地址内的值