2009-09-28 71 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