C语言学习笔记————–预处理指令

/ 0评 / 0

什么是预处理指令

        在C语言中对源码进行编译之前,会先对一些特殊指令作出解释,这就是C语言的编译预处理。为了区分这些指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用添加分号。预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾,习惯上我们尽可能将预处理指令写在源程序开头。C语言中的预处理指令主要有:宏定义指令、条件编译指令、文件包含指令。

宏定义指令

        #define 宏的名称 宏的值

        分为有参数和无参数的,比如

 
#define  age  10
#define  sum(a,b)  a+b

int main(int argc, const char * argv[]) {
    
  //使用的时候直接调用
    printf("%d",age);
    
    printf("%d",sum(10, 20));
    
    
    printf("Hello, World!\n");
    return 0;
}

与函数的区别
        有参数的宏定义与函数实现的功能看似差不多,但是他们之间有着本质的区别,宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题,并且函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数更高效。

条件编译指令

        条件编译就是根据一些条件判断后选择性编译,与流程控制比较类似,比如

 
 #define MAX 11
 
int main(int argc, const char * argv[]){

#if defined(MAX)
	#if MAX == 0
     		printf("MAX是0");
 	#elif MAX > 0
    	 	printf("MAX大于0");
 	#else
    	 	printf("MAX小于0");
 	#endif
#endif

//当然可以简化为
#ifdef MAX

#endif

//当然也就存在
#ifndef MAX

#endif

     return 0;
 }

文件包含编译指令

        文件包含指令就是包含文件用的,在前面我们都看到了 #include 这类了,这就是文件包含指令

 
#include <> //是在系统库中寻找
#include ""   //是在我们自己写的文件中寻找

        文件包含指令允许嵌套包含,但是不允许递归包含,就像文件啊包含了文件b,文件b包含了文件c,这是允许的,文件a包含了文件b,文件b也包含了文件a,这是不允许的。

        但是如果文件a包含了文件b,文件c包含了文件a和文件b,这样语法没有问题,但是会导致重复包含,降低编译的效率,这样我们就可以使用下面的方法来处理这个问题。

 
#ifndef _A_H_
#define _A_H_

//在导入文件的时候会先检验是否定义过a中的变量、函数,没有的话会去定义,定义过的话就会跳过定义,往下执行。
 
#endif


#ifndef _B_H_
#define _B_H_

 
#endif

评论已关闭。