2010年5月24日星期一

#ifdef的用法

#ifdef的用法

头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

#ifndef <标识>
#define <标识>

......
......

#endif

<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_

......

#endif


(2)

灵活使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。
代码举例:新建define.cpp文件

#include "iostream.h"
int main()
{
#ifdef DEBUG
cout<< "Beginning execution of main()";
#endif
return 0;
}
运行结果为:Press any key to continue

改写代码如下:
#include "iostream.h"
#define DEBUG
int main()
{
#ifdef DEBUG
cout<< "Beginning execution of main()";
#endif
return 0;
}
运行结果为:Beginning execution of main()
Press any key to continue

更一般的情况是,#define语句是包含在一个特定的头文件中。
比如,新建头文件head.h,在文件中加入代码:

#ifndef DEBUG
#define DEBUG
#endif

而在define.cpp源文件中,代码修改如下:
#include "iostream.h"
#include "head.h"
int main(){
#ifdef DEBUG
cout<< "Beginning execution of main()";
#endif
return 0;
}
运行结果如下:Beginning execution of main()
Press any key to continue
结论:通过使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。


(3)
如果你的程序由几个文件组成,而且有两个以上的文件都要包含同一个文件,为了避免重复包含同一个文件,所以在要被包含多次的文件中用#ifdef。
#ifdef 就是说if define,(如果定义了)
就像if else语句一样

/*试举一个例子:
如果想编写一个既可用 TC 编译又可用 VC 编译的程序,但不同的编译器生成的可执行文件的功能不同时, #ifdef 就有用了.

下面这个程序,如果用 VC 编译,只会显示一句话; 但若用 TC 编译,既显示一句话,又把背景颜色改为蓝色。
这样做的原因是 VC 没有 textbackground() 这个函数, 为了不改变源程序而适应不同的编译器, 这种条件编译(conditional compilation)的方法比较有用.
另外,有些 Windows API 对操作系统的版本有要求,这时条件编译又可派上用场了.
*/

#i nclude
#i nclude

#ifdef WIN32 /*使用 Visual C++ 6.0 作为编译器时, "WIN32" 自动被VC定义,*/
#define VC /*从而定义了"VC"*/
#endif

int main(void)
{
#ifdef VC /*如果 VC 被定义, 执行下面的代码*/
printf("This program was compiled by VC 6.0\n");

#else /*否则(即 VC 未被定义), 执行下面的代码*/
/*使用 Turbo C 作为编译器时执行*/
textbackground(BLUE); /*背景颜色改为蓝色*/
clrscr();
printf("This program was not compiled by VC 6.0\n");
#endif /*#ifdef VC*/

/*不论用何编译器, 以下代码都会被编译*/
printf("Hello, world");
getch();
return 0;

没有评论: