类似C语言的条件编译过程调用(100)

  • 主题发起人 地质灾害
  • 开始时间

地质灾害

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调用了。
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
测试一下....
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
实际上还是CALL调用,某种情况会影响效率。
 

地质灾害

Unregistered / Unconfirmed
GUEST, unregistred user!
主要目的是为了条件编译. 在编译选项里取消Assert后 不编译调试用的语句.
 
L

liuls

Unregistered / Unconfirmed
GUEST, unregistred user!
这样不知是否满足你要求procedure DEBUG_OUTPUT(X);begin{$IFDEF DEBUG} WriteLn(……)
{$ENDIF}end;
 

地质灾害

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure DEBUG_OUTPUT(X);begin{$IFDEF DEBUG} WriteLn(……)
{$ENDIF}end
免不了调用你这个DEBUG_OUTPUT(除非编译器看到没有任何代码,优化掉了)。Assert可以连DEBUG_OUTPUT调用都不编译。
 

地质灾害

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 
顶部