1、预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息
2、宏定义
(1)宏
定义常量与命令-避免幻数。
#define MAX 100
#define SIZE 1024
#define LOGIN_SUCCESS 1
#define LOGIN_FAIL 0
【注意】:在宏定义的命名时,尽量能够清晰的表明其用途。
(2)宏定义函数
【注意】宏函数与自定义函数的区别?
从以下几个方面讲:
(1)宏函数在预处理阶段处理,而自定义函数在编译阶段处理。
(2)宏函数比较灵活,但会产生一定的副作用,因为宏函数只是傻瓜式的替换,不会进行语法分析。
(3)自定义函数需要分配内存空间、释放等一系列的操作,二宏函数只是替换,因此宏函数的效率相对高一些。
一般将简单的函数或者平凡被调用的函数用宏函数替代。
【注意2】
以编译时间换空间–宏函数;
以空间换执行时间–内敛函数(inline);
3、内置宏定义
func(显示函数名)
LINE(显示行号)
TIME(显示时间)
DATE(显示日期)
【注意3】typedef与#define的区别?
(1) 执行时间不同
关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
(2)功能不同
typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。
define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
(3)作用域不同
define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。
4、条件编译指令
#if#endif、/#else、/#elif指令
#ifdef和#ifndef指令
【注意4】#ifndef和#define的作用
防止头文件重复包含导致的重复定义。
这二者主要用于防止重复包含。我们一般在.h头文件前面加上这么一段:
//头文件防止重复包含
//funcA.h
#ifndef FUNCA_H
#define FUNCA_H
//头文件内容
#end if
这样,如果a.h包含了funcA.h,b.h包含了a.h、funcA.h,重复包含,会出现一些type redefination之类的错误。
#if defined等价于#ifdef; #if !defined等价于#ifndef
5、其他预处理命令
#error指令将使编译器显示一条错误信息,然后停止编译。
#line指令改变_LINE_与_FILE_的内容,它们是在编译程序中预先定义的标识符。
#pragma指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。
复制代码
//例10,#line举例
#line 100 //初始化行计数器
#include<stdio.h> //行号100
int main()
{
printf("Hello World!\n");
printf("%d",__LINE__);
return 0;
}