我想通过for
循环将值传递给宏,但是当我尝试传递值时会出错,请尽快帮助m。当i
的值作为Valve(i)传递给宏时,它会给出错误
我的代码如下:
#define Valve(x) stTest.bValve##x##_Cmd
typedef struct OperationFlags
{
int bValve1_Cmd;
int bValve2_Cmd;
}FLAGS_TypeDef;
void main(void)
{
FLAGS_TypeDef stTest;
int j,i;
stTest.bValve1_Cmd = 4;
stTest.bValve2_Cmd = 9;
for(i=1;i<=2;i++)
{
j=Valve(1);
printf("%d",j);
}
}
答案 0 :(得分:2)
很正常! 预处理器(处理宏的“事物”)在C编译器之前运行。因此,它仅在生成可编译代码时才有效。
在您的情况下,如果您使用显示的代码
j=Valve(1)
它将适用于该值,因为它将产生:
j=stTest.bValve1_Cmd
但它只会使用该值执行整个循环。 当您使用“i”更改参数“1”以实际执行循环时,它将生成:
j=stTest.bValvei_Cmd
无效。
要做你想做的事,只需使用矢量:
typedef struct OperationFlags
{
int bValve_Cmd[2];
}FLAGS_TypeDef;
#define Valve(x) stTest.bValve_Cmd[x]
//....
for(i=1;i<=2;i++)
{
j=Valve(1);
printf("%d",j);
}
答案 1 :(得分:0)
宏替换在运行时之前完成,因此您不能使用包含值X
的变量2
来获取stTest.bValve2_Cmd
。相反,您将获得stTest.bValveX_Cmd
,其中不存在符号。
您必须找到另一种方法,例如拥有一个您可以使用X
来选择的值数组:
#define Valve(x) stTest.bValveX_Cmd[x]
typedef struct OperationFlags {
int bValveX_Cmd[2];
} FLAGS_TypeDef;
答案 2 :(得分:0)
试试这个#define Valve(x) (x == 1 ? stTest.bValve1_Cmd : stTest.bValve2_Cmd)
#define Valve(x) (*(&stTest.bValve1_Cmd + (x-1)))
注意:如果环境发生变化,它可能无效。它也不能用在位域中。
添加支票
#define Valve(x) (*(&stTest.bValve1_Cmd + (x-1))); \
assert(offsetof(FLAGS_TypeDef, bValve2_Cmd) == sizeof(int))