c++头文件中 #ifndef是什么意思?
发布网友
发布时间:2022-04-24 12:46
我来回答
共3个回答
热心网友
时间:2023-10-13 06:59
定义成空的呗
这就是个小技巧, 为了防止两次include同一个头文件。
第一次include的时候由于 ns_telnet_h没定义,所以宏里面的内容(也就是头文件的全部内容了) 会被编译。 而第二次include它的时候由于 ns_telnet_h已经被定义,所以宏里面的内容不会被编译。 这个宏没define成任何有意义的东西,是因为实际上只是需要ns_telnet_h存在就可以,它的内容无所谓
热心网友
时间:2023-10-13 07:00
#ifndef
xxx//如果没有定义xxx
#define
xxx//定义xxx
#endif
//结束如果
这个用法主要是在头文件中,主要是为了防止类重复的include,所以在类的头文件之前加上前面两个,用类名替代xxx,在最后加上最后一句。
--------------------------------------------------
另,谢谢楼下的补充,不过有一点要注意的是,在c++里面中,尽量不要使用#define定义常量。见:
5.1
为什么需要常量
如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?
(1)
程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。
(2)
在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
(3)
如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。
l
【规则5-1-1】
尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。
例如:
#define
max
100
/*
c语言的宏常量
*/
const
int
max
=
100;
//
c++
语言的const常量
const
float
pi
=
3.14159;
//
c++
语言的const常量
5.2
const
与
#define的比较
c++
语言可以用const来定义常量,也可以用
#define来定义常量。但是前者比后者有更多的优点:
(1)
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2)
有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
l
【规则5-2-1】在c++
程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
5.3
常量定义规则
l
【规则5-3-1】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。
l
【规则5-3-2】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。
热心网友
时间:2023-10-13 07:00
条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。
了解:条件编译当然也可以用条件语句来实现。 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长,采用条件编译的方法是十分必要的。
#ifndef 标识1 //判断"标识1"是否定义,如果被定义则返回假,如果没有被定义则返回真。
/*举例:*/
语句1 #ifndef 标识1
语句2 #define 标识1
语句3 #endif
语句4 ……
语句5 ……
该段代码意思是:如果标识1没有被定义,则重定义标识1,即执行语句2、语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4、语句5、……
/***********************************/
备注:#ifndef 和 #endif 要一起使用,如果丢失#endif,可能会报错。
关于它更详细的介绍,请见百度百科:http://ke.baidu.com/link?url=SDpXsjGHpzgzLJt0cjLEY-gmIKStEbziY-T8RtKpbnlsv0VDT595Ga2Zt3S3LI-_t2pqfsiaepD76s2RzyiIrq