[编译预处理系列3]

#define后有定义项却无被定义项,为什么
编号: QA003234
建立日期: 2000年8月1日 最后修改日期: 2000年8月1日
所属类别: C/C++ - 新手问题
操作系统: win98 VC++6.0
编程工具: VC++6.0
问题: 专家你好!
我是一名“早期的”编程爱好者,较熟悉TC。但最近转向Windows编程时,经常发生一些令我费解的问题,如下例:
C++头文件的预编译经常出现#define后有定义项却无被定义项的情况,如:
在#if !defined(AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_)
#define AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_中,AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_被定义成了什么,这句话是什么意思,我不明白,请指教。
水平: 刚入门(Kittle)
象这种情况是为了避免头文件被多次包含。假设有a.h,b.h包含了a.h,,而c.h又包含了a.h和b.h,这样在编译c.h时会出错,因为a.h中的定义被声明了两次。为了解决这个问题,就采用了这样的机制,把a.h写成:
#if !defined(AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_)
// 如果没有包含过mainfrm.h,就定义以下内容
#define AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_
.....
#endif
这里的符号AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_只是为了表示是否包含了mainfrm.h,如果使用#define定义了,则defined(AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_)返回真。至于符号AFX_MAINFRM_H__BE42E62A_5388_11D4_A37F_9B105B2CF13D__INCLUDED_的值到底是什么并无所谓(实际被定义为空),我们关心的只是是否定义过。

你可能感兴趣的:(编程,C++,c,C#,vc++)