C语言之预处理命令基础----防备忘


C语言之预处理命令基础----防备忘


C语言的预处理命令:
①宏定义
②文件包含
③条件编译

1.宏定义----#define
①不带参数的宏定义

#define PI 3.1415926
//①宏名一般习惯大写;
//②宏定义只是简单的字符串替换,不做正确性检查,且不分配内存空间;
//③宏定义不是C语句,末尾不必添加分号;
#define CirCle PI*3
//④宏定义可以层层置换

②终止宏定义的作用域 #undef

#define G 9.8
void main()
{
}
#undef G   //注意这里的G别忘记了

③带参数的宏定义【相当于一个函数使用】

#define 宏名(参数表) 字符串

eg:

#define MAX(x,y) (x)>(y)? (x):(y)
//相对于函数来说,宏展开不为形参分配临时的内存单元,也不存在类型问题,参数也无类型
//宏定义时,字符串可以是任何类型的数据
//宏替换不占用运行时间,函数调用占用运行时间,宏替换占用编译时间

④宏展开得多值结果

#define PI 3.14
#define CIRCLE(R,L,E) R=PI*4;L=PI*PI*3;E=PI*5
//函数调用只可以得到一个返回值,而宏可以设法得到几个结果【有点狗血】

2.文件包含#include
主要说一下,使用尖括号< >和双引号" “的区别
① 使用尖括号< >,编译器会到系统路径下查找头文件;
②使用双引号” ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。也就是说,使用双引号比使用尖括号多了一个查找路径,它的功能更为强大。

3.条件编译☆☆☆☆☆☆
①#if用法

#if 整型常量表达式1
	程序段1
#elif 整型常量表达式2
	程序段2
#elif 整型常量表达式3
	程序段3
#else
	程序段4
#endif
//如常“表达式1”的值为真(非0),就对“程序段1”进行编译,
//否则就计算“表达式2”,结果为真的话就对“程序段2”进行编译,
//为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到 #else。
//这一点和 if else 非常类似。

【注】:#if 命令要求判断条件为“整型常量表达式”,也就是说,表达式中不能包含变量,而且结果必须是整数,与if是不同的。

②#ifdef用法

#ifdef 标识符
	程序段1
#else
	程序段2
#endif
//如果当前的宏已被定义过,即上面的标识符,则对“程序段1”进行编译,
//否则对“程序段2”进行编译。也可以省略 #else:

#ifdef  标识符
    程序段
#endif

eg:

只要在上述条件编译命令之前有以下宏定义就行
#define INTEGER 0
后面的宏替换字符串是多少都无所谓,有无也无所谓
#define INTEGER    //也行
#ifdef  INTEGER
    程序段   //将被执行
#endif

③#ifndef用法

#ifndef 标识符
	程序段1
#else
	程序段2
#endif
//如果当前的宏“没有”被定义过,即上面的标识符,则对“程序段1”进行编译,
//否则对“程序段2”进行编译。也可以省略 #else:

④关于条件编译的一点理解:

我在理解条件编译的时候,比如在理解#if…#else…#endif的时候,这个和if…else根本没什么区别啊,那直接用后者不就行了吗?
直到我遇到了一个问题:

int main()
{
	int obj=9;
#if obj==9
	printf("正确\n");  //①
#else
	printf("错误\n");  //②
#endif
}

结果总是输出错误,我百思不得其解!!!按照我的逻辑obj=9,应该执行①的语句。实则不然,真是我的理解不到位。

首先来说C语言的运行过程,分为下面四个步骤:
1.编辑:输入源程序并存盘(.C)
2.编译:将源程序翻译为目标文件(.OBJ)
3.链接:将目标文件生成可执行文件( .EXE)
4.运行:执行.EXE文件,得到运行结果

#if名为条件编译,固然它是在编译阶段运行的。而"int obj=0;",则是在程序运行阶段运行的。这样的话呢,在编译阶段根本没有所谓的obj,所以obj也就是不存在的,不会执行①处的语句。 那应该怎么修改呢?
将"int obj=0;“改为”#define obj 9"就可以了。因为#define也是在编译阶段进行的。
所以#if的使用场合呢,比如,你这一套代码,要在两个型号不同的单片机或者板子上使用,就可以用#define定义不同的意思,从而让#if去执行相应的适合本单片机的代码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章