| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1006 人关注过本帖
标题:C++基础问题
只看楼主 加入收藏
明天不一样
Rank: 1
等 级:新手上路
帖 子:121
专家分:0
注 册:2006-8-31
收藏
 问题点数:0 回复次数:12 
C++基础问题

有一段程序代码中有如下代码:
#if !defined(_POINT_H)
#define _POINT_H
此代码的含义是什么?另语句:#define _POINT_H的意思是定义_POINT_H,可是用define定义时应该在标识符_POINT_H后面有数字,表示标识符_POINT_H代表一个数字,这种用法没见过,请解释解释。望赐教……

搜索更多相关主题的帖子: 基础 
2006-11-04 20:31
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
这样能保证你生成的编码是是世界上唯一的
不会发生覆盖

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-11-04 20:47
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
这是预处理指令,
#if !definde(_POINT_H) // 如果没有定义_POINT_H
就执行
#define _POINT_H  //这样就定义了

它主要是确保文件只编译一次.

=×&D o I p R e E n C g T l X&×=
2006-11-04 20:52
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
该在标识符_POINT_H后面有数字
问的是这个么

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-11-04 20:56
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 

他可能天天只看到这种用法#define XX 90
看到这种就头大了.#define _POINT_H


=×&D o I p R e E n C g T l X&×=
2006-11-04 21:02
明天不一样
Rank: 1
等 级:新手上路
帖 子:121
专家分:0
注 册:2006-8-31
收藏
得分:0 
能解释解释吗?谢了

可怜可怜我吧!小弟知识贫乏,快要饿死了,大哥大姐你们行行好,给点编程知识吧!我会永远记住你们的恩情。
2006-11-04 21:04
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 

不是解释了吗?


=×&D o I p R e E n C g T l X&×=
2006-11-04 21:07
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
这是用来防止重复包含头文件而引起的错误的,例如,有如下几个文件
之前先明确一点,编译器只编译源文件,而不编译头文件

//a.h
class A{};//定义了一个类

//b.h
#include "a.h"

//main.cpp
#include "a.h"
#include "b.h"

int main()
{
return 0;
}

那么编译的时候就会出现类A重复定义的错误

为什么呢?因为编译之前,预处理器会将main.cpp中的内容根据#include展开
那么这个例子中的main.cpp展开之后就成了

//main.cpp

class A{};//从a.h中展开

class A{};//从b.h展开,因为b.h中#include "a.h"

int main()

{

return 0;

}

因此就出现了A的重定义错误

若是改成

//a.h
#ifndef H_A
#define H_A

class A{};

#endif

//b.h
#ifndef H_B
#define H_B

#include "a.h"

#endif

那么main.cpp展开之后就成了

#ifndef H_A

#define H_A


class A{};


#endif

#ifndef H_B

#define H_B

#ifndef H_A


#define H_A



class A{};



#endif


#endif

int main()


{


return 0;


}

因为第二个class A{};之前已经定义了H_A宏,因此编译器将不再编译


#define H_A



class A{};
这两句,因此也就没有了A的重定义问题

其实真正经过预处理之后的代码并没有#define之类的宏,我只是觉得这样容易理解,把本应该在预处理阶段处理的内容留到了编译阶段

[此贴子已经被作者于2006-11-5 10:42:51编辑过]


2006-11-04 21:07
明天不一样
Rank: 1
等 级:新手上路
帖 子:121
专家分:0
注 册:2006-8-31
收藏
得分:0 
太感谢了!高手,也就是说:#define  XX其中XX是一个非零值

可怜可怜我吧!小弟知识贫乏,快要饿死了,大哥大姐你们行行好,给点编程知识吧!我会永远记住你们的恩情。
2006-11-04 21:22
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
XX就是一个宏不具有值

2006-11-04 21:36
快速回复:C++基础问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012416 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved