3

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

在 C++ 中就像这样:

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

在 SAS 宏函数定义中构建包含保护是否有意义?应该怎么做?

4

2 回答 2

3

%SYMEXIST(macro-var-name)宏函数可以查看macro-var是否存在,但是你不能%IF在open中写,所以你必须将你的%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

于 2009-09-28T17:43:55.570 回答
2

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

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

于 2009-09-28T18:14:39.330 回答