2009-09-28 72 views
3

在其他编程语言(如C++)中,包含警卫用于防止相同代码的多重包含。SAS宏包括警卫

这样在C++:

#ifndef FOO_INCLUDED 
#define FOO_INCLUDED 
.... 
#endif 

是否有意义建设列入警卫到您的SAS宏功能的定义?应该怎么做?

回答

3

还有%SYMEXIST(macro-var-name)宏函数来查看宏var是否存在,但是你不能在open中写入%IF,所以你必须把你的%IF声明放在其他一些宏内。您可能最终只会编写一个宏来将您的代码封装在如下所示的源文件中。这不太好,但如果需要警卫的话,你可能会得到这个。

%macro wrapper; 
    %if %symexist(foo_defined) %then %return; 
    %macro foo; 
    %global foo_defined; 
    %let foo_defined = 1; 
    %put i am foo; 
    %mend foo; 
%mend wrapper; 

%*-- tests --*; 
options mcompilenote=all; 
%symdel foo_defined; 

%*-- first time it will define %foo --*; 
%wrapper 
%foo 
/* on log 
NOTE: The macro FOO completed compilation without errors. 
     6 instructions 108 bytes. 
i am foo 
*/ 

%*-- second time it will not --*; 
%wrapper 
%foo 
/* on log 
(no notes on macro compilation) 
i am foo 
*/ 

在调用时,SAS使可用一堆目录,文件和目录的访问(编译/不编译)宏。这使得麻烦,但不是不可能,直接找到一个宏已经可用于本次会议或没有宏,因为宏的名称。阅读本文中的(血统)细节: http://support.sas.com/resources/papers/proceedings09/076-2009.pdf

+0

谢谢。这非常符合我的目标。 – 2009-10-15 08:01:37

2

您可以使用NOMREPLACE option来防止任何宏被重新定义。

在我看来,重用宏名称和宏变量名称(甚至数据集名称)是邪恶的。如果你只定义了一次,你可以相对确定你可以重新提交代码的任何部分,并期望得到与原来相同的结果。我还喜欢将宏定义与它们被调用的代码分开。

+0

这个选项不会阻止你重新定义驻留在SASAUTOS目录中的宏。除非你先调用宏,那就是。因为一旦被调用,宏就被编译到工作库中的宏目录中,只有在这之后,该选项才会阻止重新定义。在给定会话时,哪些宏可用于调用的细节确实是血腥的。 – 2009-10-01 21:34:23