一、什么是预处理指令
预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义, 文件包含 , 条件编译 。
预处理指令一般以 # 号开头,可以出现在文件的任何地方,作用于整个文件。
预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义, 文件包含 , 条件编译 。
预处理指令一般以 # 号开头,可以出现在文件的任何地方,作用于整个文件。
二、宏定义
宏定义分不带参数的和带参数的宏定义。
1 ➢不带参数的宏定义
由于宏是在编译之前被替换,所以由此引起的语法错误只有等到编译的时候才会对已经被替换在宏名作语法检查。
可以在定义一个宏时,引用已经定义的宏,如:
2 ➢带参数的宏定义
带参数的宏定义和看起来和函数有点相似 ,但是它们的本质的区别,宏定义只是替换,不分配内存,没有参数的传送,更没有返回值。
宏定义分不带参数的和带参数的宏定义。
1 ➢不带参数的宏定义
#import <stdio.h>
#define AGE 10 // 宏名用大写
int main()
{
int age = AGE; // AGE在编译之前会替换成 10
printf("%d", age);
return 0;
}
在编译器编译之前,代码中的所有AGE会被替换成 10 ,当AGE的值要修改的时候只需要在定义宏的地方修改一次,文件中的所有AGE都会被替换成新的值。 由于宏是在编译之前被替换,所以由此引起的语法错误只有等到编译的时候才会对已经被替换在宏名作语法检查。
可以在定义一个宏时,引用已经定义的宏,如:
//
// main.m
// 预处理指令
//
// Created by 葬花 桥 on 14-5-18.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import <stdio.h>
#define AGE 10 // 宏名用大写
#define AGE2 AGE+10 // 引用已经定义的宏
int main()
{
int age = AGE; // AGE在编译之前会替换成 10
int age2 = AGE2;
printf("age1=%d\nage2=%d", age, age2);
return 0;
}
2 ➢带参数的宏定义
带参数的宏定义和看起来和函数有点相似 ,但是它们的本质的区别,宏定义只是替换,不分配内存,没有参数的传送,更没有返回值。
#define SUM(a,b) a+b // 带参数的宏定义
这里的宏SUM带有参数,使用时会替换成这样:
三、文件包含
文件包含预编译指令我们都在用,#include<> #import 等等
它会将目标文件的内容拷贝一份到当前文件中,这很简单,没有什么可以多说的。只是要注意重复包含,循环包含造成的错误,重复定义错误或循环包含错误。
但是如果用到了条件编译就能避免重复包含引起的重复定义错误。
四、条件编译
文件包含预编译指令我们都在用,#include<> #import 等等
它会将目标文件的内容拷贝一份到当前文件中,这很简单,没有什么可以多说的。只是要注意重复包含,循环包含造成的错误,重复定义错误或循环包含错误。
但是如果用到了条件编译就能避免重复包含引起的重复定义错误。
四、条件编译
#if defined(SUM)
printf("SUM已经被定义!\n");
#endif
这现个预处理指令表示如果SUM已经被定义就编译printf语句,与些相反的是
如果SUM没有被定义,就编译printf语句
![](https://img-blog.csdn.net/20140518175034859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3FpbnFpYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
与这两个相同作用的是
那么在文件包含时,使用条件编译就可以防止重复包含同一个文件。
#if !defined(SUM)
printf("SUM没有被定义!\n");
#endif
如果SUM没有被定义,就编译printf语句
与这两个相同作用的是
#ifdef SUM // 与#if defined(SUM)相同
#endif
#ifndef SUM // 与#if !defined(SUM)相同
#endif
那么在文件包含时,使用条件编译就可以防止重复包含同一个文件。