文章目录
预处理之文件包含
预处理之宏定义
预处理 - 无参宏
宏定义,又称为宏替换,自定义一个宏(要符合标识符的命名规则),用于替换任意数据、标识符或者表达式。
无参宏定义
定义无参宏的基本格式:#define 宏名 宏替换
注意:不能给宏定义的常量赋值
注意:预处理做替换是没有计算功能的,宏名约定俗称都是大写
- 优点:一改全改
带参数宏定义
带参宏定义
定义带参宏的基本格式:#define 宏名(参数表) 宏替换
注意:
宏定义是替换,其在替换完成前并不会计算。
宏定义尽量用大写,使其在程序中容易辨别区分。
宏定义的优缺点
优点:
- 方便程序修改
- 提高程序的运行效率:使用带参函数可完成部分函数调用的功能,既减少了系统开销,又提高了运行效率。
缺点:
- 缺少检测机制(缺少检测机制是因为在预处理过程中不会去判断语法错误,只有在程序编译时才会去判断语法错误)
预处理之文件包含
文件包含的基本格式:
包含系统头文件用<>,只会在系统头文件中找
包含自定义头文件用"",在自定义头文件中找不到就会在系统头文件中找
注意:文件包含允许嵌套,即在一个被包含文件中可以包含其它文件。
演示过程:
头文件的嵌套包含可能会引起头文件的重复包含,从而出现函数重定义,而宏定义语句可以防止头文件重复包含。
#pragma once
是一种预处理指令,用于确保头文件只被编译一次,以防止重复包含。
-
我们先创建一个头文件
tool1.h
,并在文件中写入内容
-
并在
文件包含.c
文件中导入使用
-
我们再创建一个
tool2.h
的头文件,并写入内容 -
注意:因为
tool1.h
中已包含了#include<stdio.h>
,所以在tool2.h
中就不用再写入,可直接使用printf()
-
这时再在
文件包含.c
中运行,发现报错
-
错误的原因是因为头文件重定义
-
解决办法:在程序上方加上:
#pragma once
,防止头文件被重复包含
-
重新运行
文件包含.c
中的程序
预处理之条件编译
1、#if……#else的使用
#if 表达式
代码段1;
#else
代码段2;
#endif
//判断表达式的逻辑值(真或假),若逻辑值为真
//则编译代码段1,否则编译代码段2,与if……else的使用方法类似
2、#ifdef……#endif
①格式一:
#ifdef 宏名
代码段;
#endif
//如果定义了宏"宏名",则编译代码段
②格式二:
#ifdef 宏名
代码段1;
#else
代码段2;
#endif
//如果定义了宏"宏名",则编译代码段1,否则编译代码段2;
3、#ifndef……#endif
①格式一:
#ifndef 宏名
代码段;
#endif
//如果没有定义宏"宏名",则编译代码段
②格式二:
#ifndef 宏名
代码段1;
#else
代码段2;
#endif
//如果没有定义宏"宏名",则编译代码段1,否则编译代码段2;
举例
#include<stdio.h>
#define FLAG 0
int main()
{
char name[20] = "abcABCdef";
int x = 0;
while (name[x] != '\0')
{
#ifdef FLAG
if (name[x] >= 'a' && name[x] <= 'z')
{
name[x] = name[x] - ('a' - 'A');
}
#else
if (name[x] >= 'A' && name[x] <= 'Z')
{
name[x] = name[x] + ('a' - 'A');
}
#endif
x++;
}
puts(name);
}