您的位置 首页 发布

#define后边只要一个标识符的解说

一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,

一般状况下,源程序中一切的行都参与编译。可是有时期望对其间一部分内容只在满意必定条件才进行编译,也便是对一部分内容指定编译的条件,这便是“条件编译”。有时,期望当满意某条件时对一组句子进行编译,而当条件不满意时则编译另一组句子。
条件编译指令最常见的方式为:
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的效果是:当标识符现已被界说过(一般是用#define指令界说),则对程序段1进行编译,不然编译程序段2。
其间#else部分也能够没有,即:
#ifdef
程序段1
#denif
这儿的“程序段”能够是句子组,也能够是指令行。这种条件编译能够进步C源程序的通用性。假如一个C源程序在不同计算机体系上体系上运转,而不同的计算机又有必定的差异。例如,咱们有一个数据类型,在Windows渠道中,应该运用long类型表明,而在其他渠道应该运用float表明,这样往往需要对源程序作必要的修正,这就降低了程序的通用性。能够用以下的条件编译:
#ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#endif
假如在Windows上编译程序,则能够在程序的开端加上
#define WINDOWS
这样则编译下面的指令行:
#define MYTYPE long
假如在这组条件编译指令之前曾呈现以下指令行:
#define WINDOWS 0
则预编译后程序中的MYTYPE都用float替代。这样,源程序能够不必作任何修正就能够用于不同类型的计算机体系。当然以上介绍的仅仅一种简略的状况,能够根据此思路规划出其它的条件编译。
例如,在调试程序时,常常期望输出一些所需的信息,而在调试完成后不再输出这些信息。能够在源程序中刺进以下的条件编译段:
#ifdef DEBUG
print (“device_open(%p)n”, file);
#endif
假如在它的前面有以下指令行:
#define DEBUG
则在程序运转时输出file指针的值,以便调试剖析。调试完成后只需将这个define指令行删去即可。有人或许觉得不必条件编译也可达此意图,即在调试时加一批printf句子,调试后逐个将printf句子删去去。确实,这是能够的。可是,当调试时加的printf句子比较多时,修正的工作量是很大的。用条件编译,则不必逐个修改printf句子,只需删去前面的一条“#define DEBUG”指令即可,这时一切的用DEBUG作标识符的条件编译段都使其间的printf句子不起效果,即起一致操控的效果,好像一个“开关”相同。
有时也选用下面的方式:
#ifndef 标识符
程序段1
#else
程序段2
#endif
仅仅榜首行与榜首种方式不同:将“ifdef”改为“ifndef”。它的效果是:若标识符未被界说则编译程序段1,不然编译程序段2。这种方式与榜首种方式的效果相反。
以上两种方式用法差不多,根据需要任选一种,视便利而定。
还有一种方式,便是#if后边的是一个表达式,而不是一个简略的标识符:
#if 表达式
程序段1
#else
程序段2
#endif
它的效果是:当指定的表达式值为真(非零)时就编译程序段1,不然编译程序段2。能够事前给定必定条件,使程序在不同的条件下履行不同的功用。
例如:输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。
#define LETTER 1
main()
{
char str[20]=”C Language”,c;
int i=0;
while((c=str[i])!=){
i++;
#if LETTER
if(c>=a&&c<=z) c=c-32;
#else
if(c>=A&&c<=Z) c=c+32;
#endif
printf(“%c”,c);
}
}
运转成果为:C LANGUAGE
现在先界说LETTER为1,这样在预处理条件编译指令时,由于LETTER为真(非零),则对榜首个if句子进行编译,运转时使小写字母变大写。假如将程序榜首行改为:
#define LETTER 0
则在预处理时,对第二个if句子进行编译处理,使大写字母变成小写字母(大写字母与相应的小写字母的ASCII代码差32)。此刻运转状况为:
c language
有人会问:不必条件编译指令而直接用if句子也能到达要求,用条件编译指令有什么优点呢?确实,此问题彻底能够不必条件编译处理,但那样做方针程序长(由于一切句子都编译),而选用条件编译,能够削减被编译的句子,然后削减方针的长度。当条件编译段比较多时,方针程序长度能够大大削减。_______________________________________________________________________________________

#ENDIF
#define __CONFIG_H
#define的后边只要一个标识符,而没有被替换的数,谁能解释一下这是什么意思?

你说的是.h里的文件吧。在最后边应该还有个 #endif , 是为了防止.h文件被重界说而写的.比方A.C包含了B.H和C.H,B.H又包含了C.H ,当编译A.C的时分就会重复编译C.H了。当C.H前写上
#ifndef __CONFIG_H
#ifndef __CONFIG_H
#ifndef __CONFIG_H 这句话就不能经过。由于曾经就define过了。就防止了重界说。

总结如下:
用#ifndef,防止重复界说,它仅仅是一个宏界说,这个大都用在C言语的排他界说中。最常见的用法是进行整个共用头文件的彻底封装,以防止呈现嵌套引证,重复界说的状况。一般的用法如下:
#ifndef __CONFIG_H
#define __CONFIG_H
头文件的文件体
#define __CONFIG_H

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/256587.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部