C学习笔记之预处理指令
一、什么是预处理指令
预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译。
预处理指令一般以 # 号开头,能够出如今文件的不论什么地方,作用于整个文件。
预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译。
预处理指令一般以 # 号开头,能够出如今文件的不论什么地方,作用于整个文件。
二、宏定义
宏定义分不带參数的和带參数的宏定义。
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 等等
它会将目标文件的内容拷贝一份到当前文件里,这非常easy,没有什么能够多说的。仅仅是要注意反复包括,循环包括造成的错误,反复定义错误或循环包括错误。
可是假设用到了条件编译就能避免反复包括引起的反复定义错误。
四、条件编译
文件包括预编译指令我们都在用,#include<> #import 等等
它会将目标文件的内容拷贝一份到当前文件里,这非常easy,没有什么能够多说的。仅仅是要注意反复包括,循环包括造成的错误,反复定义错误或循环包括错误。
可是假设用到了条件编译就能避免反复包括引起的反复定义错误。
四、条件编译
#if defined(SUM) printf("SUM已经被定义!\n"); #endif
这现个预处理指令表示假设SUM已经被定义就编译printf语句,与些相反的是
假设SUM没有被定义,就编译printf语句
与这两个同样作用的是
那么在文件包括时,使用条件编译就能够防止反复包括同一个文件。
#if !defined(SUM) printf("SUM没有被定义!\n"); #endif
假设SUM没有被定义,就编译printf语句
与这两个同样作用的是
#ifdef SUM // 与#if defined(SUM)同样 #endif #ifndef SUM // 与#if !defined(SUM)同样 #endif
那么在文件包括时,使用条件编译就能够防止反复包括同一个文件。