繁体   English   中英

通过 for 循环将值传递给宏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM