c语言预处理那点事
可能我们想到预处理,就想到了include和define.我们可能以为预处理很简单,但是预处理可不只是这两个,预处理还有很多需要我们注意的事情。用好了预处理,可以让我们的程序更加的合理科学。
1.include
相信很多人都见过include。
那么能说出来 #include< > 与 #include " " 有什么区别吗
答:#include< > 引用的是编译器的类库路径里面的头文件。
#include" " 引用的是你程序目录的相对路径中的头文件。
什么意思呢?
先来解释第一句话 #include< > 引用的是编译器的类库路径里面的头文件。
假如你编译器定义的自带头文件引用在 C:\Keil\c51\INC\ 下面,则 #include<stdio.h> 引用的就是 C:\Keil\c51\INC\stdio.h 这个头文件,不管你的项目在什么目录里, C:\Keil\c51\INC\stdio.h 这个路径就定下来了,一般是引用自带的一些头文件,如: stdio.h、conio.h、string.h、stdlib.h 等等。
#include" " 引用的是你程序目录的相对路径中的头文件。
假如你的项目目录是在 D:\Projects\tmp\ ,则 #include"my.h" 引用的就是 D:\Projects\tmp\my.h 这个头文件,一般是用来引用自己写的一些头文件。如果使用 #include" " ,它是会先在你项目的当前目录查找是否有对应头文件,如果没有,它还是会在对应的引用目录里面查找对应的头文件。例如,使用 #include “stdio.h” 如果在你项目目录里面,没有 stdio.h 这个头文件,它还是会定位到 C:\Keil\c51\INC\stdio.h 这个头文件的。
注意: 使用 #include " " 会先在相对路径下搜索,如果没有,则会定位到编译器的类库路径里。
2.define
#define应该很多人用,我们都知道它是宏定义的意思。宏定义可以用来·定义·数值, 字符串, 表达式
数值宏常量:
#define PI 3.141592654
注意 :后面没有分号。这并不是一个语句,因此不用加分号
这一句的意思就是 给 3.141592654 取了个名字叫 PI ,在程序中要使用 3.141592654 时 ,可以直接用PI
除了可以定义数值宏常量,经常还用来定义字符串 ,尤其是路径:
#define path C:\Keil\c51\INC\
还可以用来定义表达式
#define S 60*60*50*78
注意:宏定义之间的空格很有讲究,在定义宏的时候一定要注意什么时候该用空格,什么时候不该`用空格
例如
#define SUM (X) (X) + (X)
这个宏定义是什么意思呢?
编译器认为 定义了一个 宏 SUM 代表的是 (X) (X) + (X)
因此一定要注意这个问题。但是在宏定义 SUM(X) 好了之后 有无空格都没有关系了。
SUN(X) 与 SUM (X) 是一样的。
3.条件编译
条件编译的功能使得我们可以按照不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。
条件编译有如下3种形式:
第一种形式:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的功能是如果标识符已被#define命令定义过则对程序段1进行编译,不然则对程序段2进行编译
#else 可以没有,写成如下形式
#ifdef 标识符
程序段
#endif
第二种形式:
#ifndef 标识符·
程序段1
#else
程序段2
#endif
它的功能是如果标识符未被#define 命令定义 ,则对程序段1进行编译,不然则对程序段2进行编译。
这里ifdef 改为了ifndef需要特别注意一下
第三种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
它的功能是,如常量表达式的值为真,则对程序段1进行编译,不然则对程序段2进行编译。
#elif与else if 相同,形成一个if else-if阶梯状语句,可进行多种编译选择
当然预处理还有很多,这也是比较常见的需要我们知道的,如果对预处理有兴趣,可以去看看一些书籍,上面讲得十分全面。
上一篇: js中的类型的那些事
下一篇: python中字典的那些事(1)