| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1231 人关注过本帖
标题:高手们过来解释一下条件编译!
只看楼主 加入收藏
cpp
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2004-9-3
收藏
 问题点数:0 回复次数:4 
高手们过来解释一下条件编译!

在书上看了关于条件编译的一节内容

但是由于书本的章幅有限,未解释得很明白

敬请高手们过来帮我解释一下(越具体越好,越基本越好)

拜托了!!

搜索更多相关主题的帖子: 条件 编译 解释 
2004-10-05 23:01
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
你是指#ifndef之类吗?好像很多书都说得很简单随便带过……
2004-10-06 00:46
cpp
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2004-9-3
收藏
得分:0 

版主帮忙解释一下下面这个程序吧!

这里好象还涉及到了递归函数,这使我赶到非常迷惑。

望能指点迷津。

# include <iostream.h> # define DEBUG

int factorial( int num ) { if(num == 0) return 1; else { # if defined(DEBUG) static i; cout<<"call times:"<<++i<<",num = "<<num<<endl; # endif return factorial(num - 1) * num; } } void main() { int number; cout<<"Enter a integer : "; cin>>number; cout<<"The tactorial number : "<<factorial(number)<<endl; }

2004-10-11 18:03
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

条件编译是一种保证原代码兼容的机制。

根据不同的预定义,它可以立刻改变原程序的功能。

一般用于调试、代码兼容等方面。

当符合条件时,# if 和# endif中的代码参加编译,否则,# if 和# endif中的代码不参加编译,就像没有写这些语句一样。

你上面的代码就是用于调试用的,在程序没有正式发布以前,你需要调试,用一些调试信息。那么,你在程序的头部定义

# define DEBUG

下面的语句:

static i; cout<<"call times:"<<++i<<",num = "<<num<<endl;

由于你定义了DEBUG,使的条件编译满足条件,语句正常编译。执行到这里将打印出出错信息

然后,当你的程序变的完美了 ,需要最终发布了。你可以去掉# define DEBUG这一行,那么程序将变成:

# include <iostream.h>

int factorial( int num ) { if(num == 0) return 1; else { return factorial(num - 1) * num; } } void main() { int number; cout<<"Enter a integer : "; cin>>number; cout<<"The tactorial number : "<<factorial(number)<<endl; }

这样,最终应用程序的可执行文件变小,而你也不用一行一行删除那些没有用的错误输出了。另外,当程序很大时,找到要删除的语句并删除是很困难的事情!!


永不放弃!
2004-10-11 19:09
kuangjingbo
Rank: 1
等 级:新手上路
帖 子:312
专家分:0
注 册:2004-4-24
收藏
得分:0 

考虑另外一种用法:

在windows2000中,字符有两种编码方式:ANSI 和UNICODE编码

ANSI字符使用char 就可以,而UNICODE字符要使用wchar才可以

假如,现在有个函数要在窗口上打印一串字符,该函数名字是:DrawText

于是针对两种字符都要写一个函数,针对ANSI字符为:void DrawTextA(char * str);

针对UNICODE字符为,void DrawTextW(wchar * str);

但是,通常你在看别人的程序时,你看不见 DrawTextA和DrawTextW,你只能看见DrawText

那是怎么实现的呢?

也是使用条件编译:

在一些头文件里,有如下定义:

#ifdef UNICODE

#define TCHAR wchar

#else

#define TCHAR char

#endif

#ifdef UNICODE

#define DrawText DrawTextW

#else

#define DrawText DrawTextA

#endif

那么在你的原文件中,你就可以以void DrawText(TCHAR str);的统一形式调用了

只要你定义了UNICODE,那么就是调用UNICODE形式,否则就是以ANSI形式打开


永不放弃!
2004-10-11 19:25
快速回复:高手们过来解释一下条件编译!
数据加载中...
 
   



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

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