预处理 ——#
预处理功能:宏定义、文件包含、条件编译。
预处理命令
#include(文件包含命令)
#define(宏定义命令)
#undef
#if(条件编译)
#ifdef
#ifndef
#elif
#endif
defined函数(与if等结合使用)
一、#include——文件包含
第一种----尖括号
#include <stdio.h>
第二种----双引号
#include "stdio.h"
使用尖括号和双引号的区别在于头文件的搜索路径
尖括号:编译器会到系统路径下查找头文件
双引号:编译器会先在当前目录下查找头文件,如果没有找到,再到系统路径下查找
二、#ifndef——条件编译
1.作用:
#ifndef 是"if not defined"的简写,是预处理功能当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是:
1、防止头文件被重复包含和编译;
2、便于程序的调试和移植;
#ifndef起到的效果是防止一个源文件多次包含同一个头文件
2.应用:
一般把头文件的内容都放在#ifndef和#endif中吧。不管你的这个头文件会不会被多个文件引用,你最好都加上这个。一般格式是这样的:
#ifndef <标识>
#define <标识>......
头文件内容
......#endif
eg. stdio.h
(标识的明明规则一般是头文件名全大写,前面加下划线,并把文件名中的"."也变成下划线)
#ifndef _STDIO_H
#define _STDIO_H......
stdio.h文件的内容
......#endif
3.应用
#ifndef 标识符#define 标识符程序段 1#else程序段 2#endif
三、#define ——宏定义
它的作用是当“标识符”没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。
格式:#define 标识符 字符串
并不是所有情况下#define所定义的字符串都会被替换,有一种特殊情况:被替换的字符串在""内
代码示例:
#include <stdio.h>#define MX 10 //一般把#define写在所有函数之外
#define C (4 * 1024)
#define ABS(x) (((HATA_S32)(x) < 0) ? (-(HATA_S32)(x)) : (HATA_S32)(x))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
//宏定义函数
#define CHECK_ERROR(state, error_code)
if (state)
{ return error_code;
}
//int main()
{#define MN 0printf("MX");int a, b=MX, c=MN;c = MAX(a, b) ;//宏定义表达式CHECK_ERROR(c != 10, 0x01);
}
1.定义位置:在某个函数内,还是在所有函数之外(不太建议把#define写在函数内),
2.#define作用域:不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。
typedef:如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾;如果放在某个函数内,它的作用域就是从它定义开始直到该函数结尾。
不管是typedef还是define,其作用域都不会扩展到别的文件。即使是同一个程序的不同文件,也不能互相使用。
3.内存:#define和声明、定义都不同,宏定义不占内存空间,因为宏在预处理阶段就会被替换掉,到了编译的阶段是没有宏存在的,它在预编译阶段就被处理了
#define(宏定义)----由预处理器来处理
四、#undef
typedef----在编译阶段由编译器处理
上文提到#define的作用域是从它声明开始到文件结尾,#undef就是取消之前的宏定义(也就是#define的标识符)
格式:#undef 标识符(注意:如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令)
#include <stdio.h>#define MAX 10
int main()
{printf("%d", MAX);
#undef MAX
#define MAX 20printf("%d", MAX);
}
五、#if
#if命令要求判断条件为整型常量表达式,也就是说表达式中不能包含变量,而且结果必须是整数;而if后面的表达式没有限制,只要符合语法就行,这是#if和if的一个重要区别。
#include "stdio.h"
#define MAX 10
int main()
{printf("MAX = %d\n", MAX);#if MAX == 10printf("MAX已被定义\n");
#elseprintf("MAX未被定义\n");#undef MAX#define MAX 20
#endifprintf("MAX = %d\n", MAX);return 0;
}
六、#ifdef
#ifdef的作用是判断某个宏是否定义,如果该宏已经定义则执行后面的代码,一般使用格式如下
#ifdef 宏名
//程序段1
#else
//程序段2
#endif
它的意思是,如果该宏已被定义过,则对程序段1进行编译,否则对程序段2进行编译(这个和上面的#if一样最后都需要#endif),上述格式也可以不用#else,这一点上和if else相同
代码示例:
#include <stdio.h>#define MAX 10
int main()
{
#ifdef MAXprintf("MAX已被定义\n");
#elseprintf("MAX未被定义\n");#undef MAX#define MAX 20
#endifprintf("MAX = %d\n", MAX);return 0;
}