很多朋友对c语言中的条件编译,C语言中条件编译详解不是很了解,六月小编刚好整理了这方面的知识,今天就来带大家一探究竟。前言——一般来
很多朋友对c语言中的条件编译,C语言中条件编译详解不是很了解,六月小编刚好整理了这方面的知识,今天就来带大家一探究竟。
前言——一般来说,C语言源程序中的每一行代码都要编译。但是有时候,为了优化程序代码,我们只想编译其中的一部分。这时候就需要给程序加上条件,让编译器只编译符合条件的代码,舍弃不符合条件的代码。这是条件编译,相关的预编译指令如下:#定义一个预处理宏#undef取消一个宏的定义#if。
在预处理中编译条件命令相当于C语法中的if语句#ifdef来判断一个宏是否被定义。如果定义了,下面的语句#ifndef与#ifdef相反,判断一个宏是否未定义#elif。如果不满足#if、#ifdef、#ifndef或前面的#elif条件,则执行#elif之后的语句。相当于else——C语法中的ifelse对应于# if、# ifdef和# ifndef。如果不满足这些条件,则执行#else后的语句,相当于C语法中的elseendif。
结束标志。条件命令的定义#if、# ifdef和# ifndef与# if和# if、#elif一起使用,判断宏是否定义了条件编译函数。条件编译只允许编译源文件中满足条件的程序段,使得生成的目标程序更短,从而减少内存开销,提高程序效率。可以根据不同的条件编译不同的程序部分,从而生成不同的目标代码文件,提高程序的可移植性和灵活性。
应用示例#undef可以取消宏定义,对应#define。#define #define命令定义一个宏,通常根据有无参数分为对象宏和函数宏。没有参数的对象宏称为“类对象宏”。对象宏主要用于定义常数和公共标识。例如://constant definition # define MAX _ LENGTH 100//通用标识符,log output宏#define SLog printf//预编译宏#define _DEBUG函数宏。
带参数的宏。使用宏可以提高代码的运行效率:子程序调用需要推出堆栈,如果过于频繁会消耗大量的CPU计算资源。所以一些代码量小但运行频繁的代码,如果用带参数的宏来实现,会提高代码的运行效率。但是大部分C程序都不建议使用函数宏,调试起来比较困难,可以考虑用C inline代替。例如:
//Minimum function #define MIN(a,b) ((a)(b)?(a):(b)//安全内存释放函数#define SAFE_DELETE(p) {if(NULL!=p){删除p;p=NULL}} defined用于测试一个宏是否被定义。Defined(name):如果定义了宏,则返回1,否则返回0。可以用来在一个判断语句中声明多个条件,比如#ifdefined(VAX)defined(UNIX)!已定义(调试)#ifdef 、#ifndef 、#else 、#endif
#ifdef用于判断一个宏是否被定义,与#ifndef正好相反。两者都只支持判断是否定义了单个宏。#ifdef ABC//.定义时的代码ABC#elif(版本2)//.CODE_VERSION 2#else//时的代码.剩余案例# endif//# ifndef ABCD _ H # Define ABCD _ H//.some declarationcodes # endif//# ifndef ABCD _ h # if、#elif、#else、#endif #if可以支持同时判断多个宏的存在,可以和常量表达式一起使用。常见格式如下:
#if常量表达式1//.一些代码#elif常量表达式2//.其他代码#elif常量表达式3//.# else//.语句# endif常量表达式可以是合法的c常量表达式,包含宏、算术运算、逻辑运算等。如果常量表达式是未定义的宏,则其值被视为0。特别注意
#if和#ifdef的区别在判断一个宏是否被定义时,应该避免使用#if,因为宏的值可能被定义为0。请改用#ifdef或#ifndef。看两段代码,哪段代码会被编译,强调是编译,不是执行。#第一段定义XXX 0//条件编译# ifdefXXX Logic 1 # else Logic 2 # Endif # define XXX 0//第二段定义条件编译#if XXX logic1 # else logic2 # Endif第一段条件编译:将编译逻辑1。
第二个条件编译:将编译逻辑2。区别:#if不仅关心宏是否被定义,还关心宏的逻辑的真实性。#ifdef(#if defined())、#ifndef(#if!Defined()只关心宏是否定义,不关心宏的逻辑。#if 0或#if 1注释
屏蔽大块代码时,最好使用“#if 0”而不是“”。(因为在使用“”对大段进行注释时,需要防止注释代码段中嵌套“”。一旦“”嵌套了“”,那么你注释的代码区域就不是你想要的区域了)。1)常见的一个,如果有不想要的代码,可以直接用' #if 0 '的形式注释.#endif '其效果相当于“'# if0.# endif。
2)选择结构的条件编译。(如果常数为真[不是0,任何数,只要不是0],执行程序段1,否则执行程序段2。)# if常数.代码1.#否则.代码2.# endif3)嵌套情况。(如果常数a为真[非零,任意数,只要不为0],执行程序段1。当常数A为0,常数B为真时,执行程序段2;当常数A为0,常数B为0时,执行程序段3)。
# Constant A . Code 1.# else # Constant B . Code 2.# Otherwise . Code 3.#endif#endif Summary
有些程序可能想通过简单地设置调试、兼容性和平台移植中的一些参数来生成一个不同的软件。当然,所有可能的代码都可以通过变量设置写入,并在初始化时进行配置。但是在不同的情况下,没有必要把所有的代码都写出来,所以可以使用条件编译。条件编译是为了使程序运行在各种软硬件环境中,提高其可移植性。
原C/C条件编译#if、#elif、#ifdef等灵活第二篇文章来源:【微信微信官方账号:嵌入式ARM】欢迎添加关注!请注明文章出处。回顾唐子红
以上就是关于c语言中的条件编译,C语言中条件编译详解的知识,希望能够帮助到大家!
声明本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们