在TC2.0下编程,不要为了省麻烦,在程序的开头以#define NULL 0 来代替#include<stdio.h>.
我不是说这种方法不好,反而我认为用到非常妙,因为在程序中可以减少不必要的外部函数的连接,从而减少程序的负担.
但是,用#define NULL 0也得有下前提,就是编译器的模式(Model)是Tiny,Small,Medium.
那么为什么在Compact,Large,Huge下不行呢.
我举一例子,代码如下:
#include<stdio.h>
#include<conio.h>
int main(void)
{
clrscr();
printf("%d",sizeof(int*));
getch();
return 0;
}
如果在模式(Model)为Tiny,Small,Medium,结果是:2
如果在模式(Model)为Compact,Large,Huge,结果是:4
现在大家有些眉目了吧.
如果还不太明白,不要紧我再给出一个例了:
在模式为Large时:
#define NULL 0
#include<conio.h>
int main(void)
{
clrscr();
printf("%d",sizeof(NULL));
getch();
return 0;
}
结果:2
#include<stdio.h>
#include<conio.h>
int main(void)
{
clrscr();
printf("%d",sizeof(NULL));
getch();
return 0;
}
结果:4
也就是当在模式(Model)为Compact,Large,Huge下,因#define NULL 0中NULL为2个字节,
当int *pointer=NULL;因sizeof(int*)为4个字节.这就出现了一个矛盾:将2字节的NULL赋给4字节的pointer.
依照上面的说法,用#define NULL 0是不对的,那就必须得用#include<stdio.h>了.
非也,大家可以尝试以下用法:
#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL 0L
#endif
#endif
这样会更好一些.至少没有了在2字节赋值给4字节的过程中的扩容的问题.
上面说到了调试的问题,在此就多提醒大家一下:"当在整个模块中找不出问题的出处,不妨众览全局看看是否有疏忽的地方."