通过for循环将值传递给宏

时间:2014-09-09 06:34:04

标签: c visual-c++ macros

我想通过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);
  } 

}

3 个答案:

答案 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))