如何定义一个宏变量,其中包含对尚未定义的其他宏变量的引用而不生成警告?
考虑一个为不同变量生成类似图的程序.根据变量,每个数字的标签将会改变.由于除了特定的分析变量之外,所有数字都具有相似的标签,因此将标签放在程序的顶部以便于修改是有意义的.问题是,在程序中的那一点,尚未定义变量名.
例如:
/*Top of program*/
%let label = This &thing gets defined later.;
/* ... */
/*Later in program*/
%let thing = macro variable;
%put &=label;
Run Code Online (Sandbox Code Playgroud)
这会产生所需的输出:
LABEL=This macro variable gets defined later.
Run Code Online (Sandbox Code Playgroud)
但它也会在日志中生成警告:
WARNING: Apparent symbolic reference THING not resolved.
Run Code Online (Sandbox Code Playgroud)
如果我把一个%nrstr身边&thing,那么的形式label是正确的(即.LABEL=This &thing gets defined later.)但是,&thing它已被定义后,不再解析.
/*Top of program*/
%let label = This %nrstr(&thing) gets defined later.;
%put &=label;
/* ... */
/*Later in program*/
%let thing = macro variable;
%put &=label;
Run Code Online (Sandbox Code Playgroud)
这输出:
LABEL=This &thing gets defined later.
LABEL=This &thing gets defined later.
Run Code Online (Sandbox Code Playgroud)
有没有办法避免将警告写入日志?
在这里,理解%STR类型引用和%QUOTE类型引用之间的区别是有帮助的.
%QUOTE并且它的变体在宏执行时屏蔽文本,而%STR其变体在宏编译时屏蔽文本.在这种情况下,您关注的是后者,而不是前者,因为您希望&thing在执行期间解决 - 而不是在编译期间.
所以这是%NRSTR救援.您还需要使用%UNQUOTE以使宏变量完全解析 - 即取消NRSTR.
/*Top of program*/
%let label = This %nrstr(&thing.) gets defined later.;
/* ... */
/*Later in program*/
%let thing = macro variable;
%put %unquote(&label);
Run Code Online (Sandbox Code Playgroud)