【问题标题】:Passing values to macros by for loop通过 for 循环将值传递给宏
【发布时间】:2014-09-09 06:34:04
【问题描述】:

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

}

【问题讨论】:

  • 欢迎来到stackoverflow!请查看FAQ - How do I ask a good question? 了解如何提出好的问题,以便您得到好的答案。像Need a quick response 这样的请求通常会导致问题很快被关闭。另外问题是缺少一些信息以获得好的答案,尤其是错误消息是什么。
  • 我收到错误 error C2039: 'bValvei_Cmd' : is not a member of 'OperationFlags'

标签: c visual-c++ macros


【解决方案1】:

这很正常! 预处理器(处理宏的“东西”)在 C 编译器之前运行。所以,它只有在产生可编译代码时才有效。

在您的情况下,如果您使用显示的代码

j=Valve(1)

它适用于该值,因为它会产生:

j=stTest.bValve1_Cmd

但它只会使用该值执行整个循环。 当您将参数“1”与“i”更改为实际执行循环时,它将产生:

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);
}

【讨论】:

  • 除了使用数组还有其他方法吗,因为我想减少我的代码大小。所以我需要我的标志是位格式,即 int bValve_Cmd:1;
【解决方案2】:

宏替换在运行前很好完成,因此您不能使用包含值2 的变量X 来获取stTest.bValve2_Cmd。相反,你会得到stTest.bValveX_Cmd,它不存在任何符号。

您将不得不找到另一种方法来执行此操作,例如拥有一个您可以使用X 选择的值数组:

#define Valve(x) stTest.bValveX_Cmd[x]

typedef struct OperationFlags {
   int bValveX_Cmd[2];
} FLAGS_TypeDef;

【讨论】:

    【解决方案3】:

    试试这个#define Valve(x) (x == 1 ? stTest.bValve1_Cmd : stTest.bValve2_Cmd)


    #define Valve(x) (*(&amp;stTest.bValve1_Cmd + (x-1)))

    注意:如果环境发生变化,它可能无法正常工作。也不能在位域中使用。

    添加检查

    #define Valve(x) (*(&stTest.bValve1_Cmd + (x-1))); \
    assert(offsetof(FLAGS_TypeDef, bValve2_Cmd) == sizeof(int))
    

    【讨论】:

    • 这会很好用,我只发布了整个代码的示例部分。有超过 2 个标志,如 bValve_Cmd。我在我的代码中使用了大约 4-5 个这样的标志。请建议我更好的方式
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2019-12-21
    • 1970-01-01
    • 2011-02-07
    • 2020-12-13
    相关资源
    最近更新 更多