SAS宏包括警卫

时间:2009-09-28 11:40:21

标签: sas sas-macro include-guards

在其他编程语言(如C ++)中,包含防护用于防止同一代码的多个包含。

在C ++中就像这样:

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

在SAS宏功能定​​义中构建包含保护是否有意义?它应该怎么做?

2 个答案:

答案 0 :(得分:3)

%SYMEXIST(macro-var-name)宏函数来查看宏变量是否存在,但是你不能在开放时写%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

答案 1 :(得分:2)

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

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