在书上看了关于条件编译的一节内容
但是由于书本的章幅有限,未解释得很明白
敬请高手们过来帮我解释一下(越具体越好,越基本越好)
拜托了!!
版主帮忙解释一下下面这个程序吧!
这里好象还涉及到了递归函数,这使我赶到非常迷惑。
望能指点迷津。
# 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; }
条件编译是一种保证原代码兼容的机制。
根据不同的预定义,它可以立刻改变原程序的功能。
一般用于调试、代码兼容等方面。
当符合条件时,# 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; }
这样,最终应用程序的可执行文件变小,而你也不用一行一行删除那些没有用的错误输出了。另外,当程序很大时,找到要删除的语句并删除是很困难的事情!!
考虑另外一种用法:
在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形式打开