[英]Passing values to macros by for loop
我想通过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);
}
}
这是正常的! 预处理器(处理宏的“东西”)在 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);
}
宏替换是在运行之前做得很好,所以你不能用一个变量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;
试试这个#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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.