地
地质灾害
Unregistered / Unconfirmed
GUEST, unregistred user!
尽管非议不断,不可否认C语言的宏定义还是很强大的。举个简单的例子,输出调试信息,我们可以定义一个这样的宏:#ifdef DEBUG#define DEBUG_OUTPUT(x) printf(x)#else#define DEBUG_OUTPUT(x) (void(0))#endif可以用DEBUG_OUTPUT在调试版本中输出一些信息,但是编译release版本(DEBUG未定义)时就不会编译,减小了程序体积,提高了执行效率。但是在Delphi里却无法进行宏替换。你必须在每个要输出调试信息的地方加上{$IFDEF DEBUG} WriteLn(……)
{$ELSE}{$ENDIF}很不方便。那么真的没有办法像C语言那样吗?答案是否定的。不过稍微比C麻烦一点。可以把输出调试信息的例程定义成返回Boolean类型值的函数。比如function DEBUG_OUTPUT(str:string):Boolean;在要使用时这样调用:Assert(DEBUG_OUTPUT('*******'));在Delphi中。Assert在关闭了assert开关时是不编译的。如果在debug版本中开启Assert,release版本中关闭之,就达到了和宏代换一样的目的。缺点是release版本中也不能使用基于其它目的的Assert调用了。
{$ELSE}{$ENDIF}很不方便。那么真的没有办法像C语言那样吗?答案是否定的。不过稍微比C麻烦一点。可以把输出调试信息的例程定义成返回Boolean类型值的函数。比如function DEBUG_OUTPUT(str:string):Boolean;在要使用时这样调用:Assert(DEBUG_OUTPUT('*******'));在Delphi中。Assert在关闭了assert开关时是不编译的。如果在debug版本中开启Assert,release版本中关闭之,就达到了和宏代换一样的目的。缺点是release版本中也不能使用基于其它目的的Assert调用了。