前言:
现时朋友们对“预编译条件”可能比较关心,大家都需要学习一些“预编译条件”的相关知识。那么小编在网上搜集了一些对于“预编译条件””的相关知识,希望各位老铁们能喜欢,姐妹们一起来学习一下吧!上一篇写了C语言中变量的存储类别,提到普通局部变量、普通全局变量和静态局部变量及静态全局变量,这里简单了解一下C语言的预编译命令、宏定义和条件编译。
预编译命令(预编译处理--->编译---->汇编--->连接)
1、预处理:预处理是C语言的一个重要功能,如文件包含、常量定义都属于预处理命令,C语言提供的预处理功能主要有以下三种:
1)文件包含 #include2)宏定义 #define3)条件编译 #if #endif4)防止头文件重复包含
2、文件包含处理
“文件包含处理”是指一个源文件可以将另外一个源文件的全部内容包含进来,C语言提供了#include命令用来实现“文件包含”的操作
3、#include< > 与 #include“ ”
#include一般用于头文件的包含,头文件中一般为函数、结构体与全局变量的声明等,#include后跟“”和<>是有区别的:
“ ”表示系统先在file1.c所在的目录找file2.c,如果找不到,再按系统指定的目录检索。< > 表示系统直接按系统指定的目录检索。
宏定义
1、宏定义
在进行文本编辑时,“替换”是一个很有用的功能。C语言编译预处理程序也提供类似的功能:在源程序中,允许一个标识符(称为宏名)来表示一个语言符号字符串。在C语言中,“宏”分为无参数的宏和有参数的宏。
2、无参数的宏定义:#define 宏名 字符串
1)宏名一般用大写,以便于与变量区别;2)字符串可以是常数、表达式等;3)宏定义不作语法检查,只有在编译被宏展开后的源程序才会抱错;4)宏定义不是C语言,不在行末加分号;5)宏名有效范围为定义到本源文件结束;6)可以用#undef命令终止宏定义的作用域;7)在宏定义时,可以引用已定义的宏名;8)在头文件中定义的宏,其他源文件只要包含该头文件,同样可以使用此宏定义(对于宏没有声明这一说法)
3、带参数的宏定义:#define 宏名(形参表) 字符串
调用:宏名(形参表)宏展开:进行宏替换#define S(a,b) a*bArea = S(3,2);说明:用3和2分别代替宏定义中的形式参数a和 b,用3*2代替S(3,2)。因此赋值语句展开为:Area = 3*2。对带实参的宏:如S(3,2),按#define命令行中指定的字符串从左到右进行置换。若串中包含宏中的形参(如a、b),则将程序中相应的实参代替形参.如果宏定义字符串中的字符不是参数字符(如a*b中的*号),则保留,这样就形成了置换的字符串
注意:使用带参数的宏定义,最好加上括号,来看个例子:
4、带参数的宏与带参函数的区别:
1.函数调用时,先求实参表达式值,再代入形参,而宏只是简单的替换,并不求值;2.函数调用在程序运行时分配内存,而宏展开时并不分配内存,也没有返回值的概念;3.函数中的实参和行参都要定义类型,而且要求一致,宏名无类型,其参数也无类型;4.宏替换不占运行时间,只占编译时间,而函数调用占运行时间。
条件编译
1、防止头文件被重复引用#ifndef __TEST_H__#define __TEST_H__#endif如果test1.h、test2.h都引用了test.h,且main.c中同时引用了test1.h,test2.h,那么会出现头文件重复被引用的现象。2、同样的C源代码,条件选项不同可以编译出不同的可执行程序例:
本例是将一行字母字符,根据需要设置条件编译,将字母全改为大写输出,或全改为小写字母输出。
后续送上C语言指针相关内容,想了解的小伙们请关注
标签: #预编译条件