【发布时间】:2016-10-30 06:14:45
【问题描述】:
#define STRIP0 0
#define STRIP1 1
#define STRIP2 2
#define STRIP3 3
#define PINS0 2,3,4
#define PINS1 5,6,7
#define PINS2 8,9,10
#define PINS3 11,12,13
#define PINS(STRIP) { (STRIP) == (STRIP0) ? PINS0 :\
(STRIP) == (STRIP1) ? PINS1 :\
(STRIP) == (STRIP2) ? PINS2 :PINS3}
现在,如果当我调用一个接受 3 个参数的函数时,所有参数都是 int foo(int,int,int); 这样的 foo(PINS1);,那么该函数将按预期编译和工作(所有参数都被传递,就好像 #define 被替换为 "5, 6,7")
但是如果我使用宏来选择像foo(PINS(STRIP1)); 这样的引脚集,那么参数选择就会变得混乱。在这种特定情况下,错误参数列表变为“7,12,13”,对于foo(PINS(STRIP0));,它变为“4,12,13”,我看到了一种模式,但我没有专业知识来告诉和纠正正在发生的事情在编译时。
【问题讨论】:
-
如果你使用
PINS类函数宏,你会遇到两个问题:第一个是整个表达式周围的花括号,第二个是你传递的不是多个参数,而是一个单个参数,因为逗号不再是参数分隔符,而是逗号表达式。您应该重新考虑使用宏,是否可以使用inline函数包装器?或者至少修改宏,也许将函数作为参数并在宏“body”中调用? -
你为什么不写一个
if/else -
@Someprogrammerdude 我将删除花括号并编辑问题,但它对输出没有影响。当我这样做
foo(PINS1);(如问题中所指定)时,函数本身将3个数字作为参数,这使我相信逗号作为表达式没有发生,而是编译器识别出有3个参数,这就是它继续进行的原因。这就是我认为做一个选择PINS0或PINS1的宏会起作用但没有用的原因。您建议将函数作为宏中的参数可能是 krzaq 的建议