所有预处理指令都以符号#开头。此外,每个预处理指令必须单独占用一行。
1.#define
指令#define定义了一个标识符及一个字符序列(即字符集合)。在源程序中每次遇到该标识符时,就用定义的字符序列替换它。标识符被称为宏名,替换过程称为宏替换。例如:
#define datou_shuai 1
#define datou_bushuai 2
注意与const常变量替换作用的场景区分开
const int datou_shuai = 1在编译时起作用 |
---|
#define datou_shuai 1在预编译时起作用 |
const 类型为浮点数时则是要从内存读数据 |
注意,该语句没有分号。在标识符和字符序列之间可以有任意个空格,但是一旦字符序列开始,就只能由一新行结束。
定义类似函数的宏
#include<stdio.h>
#define SUM(x,y) (x*y)
int main()
{
int a = 5, b = 4;
int sum = SUM(a+5, b+6);
printf("%d \n", sum);
}
//计算时应该为a+5*b+6,即5+5*4+6=31
宏和函数的区别
1.宏在预编译时进行替换,函数编译和链接时形成代码 |
---|
2.宏不存在现场的保护和恢复,函数要进行现场保护和恢复 |
3.使用时宏有副作用,可能会参数值 |
4.宏和类型无关,函数和类型有关 |
2.#include
指令#include告诉编译器除了读包含#include的一个源文件外还要读取另一个源文件,被读入的源文件必须用双引号或尖括号括起来。
文件名是用引号还足用尖括号括起来决定了指定文件的查找方法。如果文件名用尖括号括起来,则文件以编译器的创建者定义的方式进行在找,通常,这意味着从为“包含文件”设置的一些特殊目录中查
找。如果文件名用引号括起来,则文件以其他实现所定义的方式进行查找。对许多编译器来说,这意味着查找当前工作目录。如果未找到,则按文件名括在尖括号中的方式继续查找。
通常,许多程序员使用尖括号来包含标准头文件,引号的使用则是为了包含与程序关联的文件, 但这两种用法没有硬性的规定。
include的本质是将".h"中的内容拷贝到“.cpp”中。从而生成“.i”文件。
注:数组里使用 #include 时,#include要从写,且屁股后不可加内容,数字要用逗号隔开,而字符串每行都要用双引号引起来。例:
//主函数
int ar[] = {
#include"hyh.txt" //hyh.txt内容 12 ,23, 34, 45, 56, 67 ,78, 89 ,100
};
char br[] = {
#include"nrj.txt"
};
//niu.txt内容
"You are a dog\n"
"I an a man"
该方法也可以初始化过长的字符串。
最后插入个结构体大小计算图
用#define计算结构体大小
关于#ifndef的解释,预编译起作用。