在宏内部创建宏时,如何区分当前宏参数与新宏参数?
问题分析与解决
你的代码运行结果为49而非21的核心原因是:mult_by定义的mult_by_$1宏并未引用调用时传入的参数,而是直接将mult_by的参数(7)与自身相乘,所以无论调用mult_by_7时传什么值,都会计算7*7=49。
正确实现方法
要让mult_by_$1能接收并使用调用时的参数,需要在宏定义中区分**mult_by的参数和mult_by_$1的调用参数**:
changequote([,])dnl define([mult_by], [define(mult_by_$1, [eval($1 * [$1])])])dnl mult_by(7)dnl mult_by_7(3)
代码解释
- 当调用
mult_by(7)时,展开为:define(mult_by_7, [eval($1 * 7)])——这里的[$1]会被替换为mult_by的参数7,而宏体中的$1则代表未来调用mult_by_7时传入的参数。 - 调用
mult_by_7(3)时,宏体中的$1被替换为3,最终计算3*7=21,得到预期结果。
如果需要支持多参数传入(比如批量计算),也可以用$@来接收所有调用参数:
changequote([,])dnl define([mult_by], [define(mult_by_$1, [eval($@ * [$1])])])dnl mult_by(7)dnl mult_by_7(3, 5) # 会计算3*7和5*7,输出21和35
内容的提问来源于stack exchange,提问作者pietrodito
相关产品推荐
相关产品推荐

