SAS宏包括保护 在C++等其他编程语言中,使用Engress来防止同一代码的多个包含。

SAS宏包括保护 在C++等其他编程语言中,使用Engress来防止同一代码的多个包含。,sas,sas-macro,include-guards,Sas,Sas Macro,Include Guards,在C++中类似这样: #ifndef FOO_INCLUDED #define FOO_INCLUDED .... #endif 将包含保护构建到SAS宏函数定义中有意义吗?该如何做呢?有%SYMEXIST(宏变量名)宏函数来查看宏变量是否存在,但是如果处于打开状态,则无法写入%if,因此必须将%if语句包含在其他宏中。您可能会编写一个宏,只是为了将代码包装到源文件中,如下所示。这并不漂亮,但如果需要警卫的话,你可能可以这样做 %macro wrapper; %if %symexist(f

在C++中类似这样:

#ifndef FOO_INCLUDED
#define FOO_INCLUDED
....
#endif
将包含保护构建到SAS宏函数定义中有意义吗?该如何做呢?

%SYMEXIST(宏变量名)
宏函数来查看宏变量是否存在,但是如果
处于打开状态,则无法写入
%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提供一组目录、文件和目录,用于访问(已编译/未编译)宏。鉴于宏的名称,这使得直接查找宏是否已可用于此会话变得很麻烦,但并非不可能。阅读本文中的(血淋淋的)细节:

您可以使用防止重新定义任何宏


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

此选项不会阻止您重新定义驻留在SASUNS目录中的宏。。除非你先调用宏,那就是。因为一旦调用它,宏就会被编译到工作库中的宏目录中,只有在这之后,此选项才会阻止重新定义。在给定的会话中,可以调用哪些宏的详细信息确实很糟糕。谢谢。这正是我的目标。