预处理是编译之前做的一些事情。
1. 常用的预定义符号(预先定义好的符号,代表着某种意思):
__FILE__ //当前编译的文件路径
__FUNCTION__ //当前所在函数的函数名
__DATE__ //当前编译日期
__TIME__ //当前编译时间
//以上格式占位符都用%s,如:printf("%s",__DATA__);
__LINE__ //当前行数,格式占位符用%d,如printf("%d",LINE); //注意以上这些宏定义的前后分别有两个"_",而不是一个下划线
__CRT_SECURE_NO_WARNINGS //关闭安全检查,在写代码时候加上
#define _CRT_SECURE_NO_WARNINGS 可以关闭安全检查的警告
2. 宏定义
宏定义的本质就是替换
2.1 宏定义-无参宏: #define 宏名 内容
比如定义一个宏:
#define PI 3.1415926 //用PI代替3.1415926
#define A 4+3 //用A代替4+3
2.2 宏定义-带参宏: #define 宏名(参数列表) 内容
带参宏类似一个函数,和函数的区别是参数是没有类型的、带参宏没有返回值。注意调用的时候是先替换再运算,多重调用也是先整体替换完成后再运算。
比如定义一个宏:
#define FUN(a,b){printf("%d,%d\n",a,b);printf("%d\n",a+b);}
#define F(a,b) a+b
3. 常量的定义
const int a=10; //在定义变量前加const
常量不允许被修改,常量必须初始化
4. 文件包含
我们想用库函数就需要包含头文件,也就是文件包含,当然也可以编写自定义头文件,包含自己编写的头文件。
4.1. 文件包含的基本格式:
#include<文件名> 或者#include "文件名",如:
#include
#include "文件名" //包含自定义头文件用"",在自定义头文件中找不到就会在系统头文件中去找
文件包含允许嵌套,即在一个被包含的文件中可以包含其他文件。
4.2. 头文件的重复包含
头文件的嵌套包含可能会引起头文件的重复包含,从而出现函数和变量重复定义的问题,所以需要避免头文件中重复包含,某些宏定义一句可以防止头文件重复包含,如:
#pragma once //防止头文件重复包含,不让文件的内容被包含两次,在头文件最前面添加
#pragma oce 是vs独有的,有使用平台的限制,其他平台可能不存在。
避免重复包含还有一种方法:
#ifndef __TOOL_H__ //如果没有定义,就执行下面的语句定义
#define __TOOL_H__ //定义
//在头文件中一般只声明函数,相当于一个功能。然后在同名的源文件中定义,实现功能
void fun();
#endif //和ifndef对应,结束if这个代码块
5. 条件编译
条件编译就是根据不同的条件编译不同的代码段
#if....#else....#endif //判断的是#if后面的条件真假
#ifdef....#else.....#endif //判断的是#ifdef后面的宏是否定义了
#ifndef....#else.....#endif //判断的是#ifndef后面的宏是否定义了