首页 > 解决方案 > 使用带有 MACROS 的 Switch

问题描述

我正在尝试使用头文件 (.h) 中的宏来模拟 Switch 语句。

我有一些预定义的宏:

#define MULTIPLY_BY_1      1
#define MULTIPLY_BY_10     2
#define MULTIPLY_BY_100    3
#define MULTIPLY_BY_1000   4

#define CHOSEN_FACTOR      MULTIPLY_BY_100

我有一个const result根据CHOSEN_FACTOR(用户将定义这个宏)取值的值。我在头文件中,我想像这样“模拟” switch 语句:

switch(CHOSEN_VALUE)
{
  case MULTIPLY_BY_1:
    const uint16_t result = 5;
    break;
  case MULTIPLY_BY_10:
    const uint16_t result = 50;
    break;
  case MULTIPLY_BY_100:
    const uint16_t result = 500;
    break;
  case MULTIPLY_BY_1000:
    const uint16_t result = 50000;
    break;

  default:
    break;
}

编辑:

在源文件(.c)中,我想使用这样的结果:

uint16_t foo(void)
{
  uint16_t myFoo = getMyFooValue();
  return result * myFoo;
}

是否有任何基于宏的解决方案?是否有更优化的方法来获得相同的结果?

标签: cswitch-statement

解决方案


假设我了解您的要求,我认为您正在寻找这样的东西:

#define INIT_FACTOR(var, value)               \
  #ifdef CHOSEN_FACTOR                        \         
    #if CHOSEN_FACTOR == MULTIPLY_BY_1        \
      const uint16_t var = value              \
    #elif CHOSEN_FACTOR == MULTIPLY_BY_10     \
      const uint16_t  var = value * 10        \
    #elif CHOSEN_FACTOR == MULTIPLY_BY_100    \
      const uint16_t var = value * 100        \
    #elif CHOSEN_FACTOR == MULTIPLY_BY_1000   \
      const uint16_t var = value * 1000       \
    #endif                                    \
  #else                                       \
    const uint16_t var = value                \
  #endif                                      

这将定义一个名为的宏INIT_FACTOR,它接受两个参数,即要定义的变量的名称和起始值。您可以将其添加到代码正文中

INIT_FACTOR(result, 5);

然后,如果CHOSEN_FACTORMULTIPLY_BY_100,那条线将扩展到

const uint16_t result = 5 * 100;

如果CHOSEN_FACTOR未定义,则该行扩展为

const uint16_t result = 5;

请记住,宏替换发生在编译时,而不是运行时。如果您想要一个运行时解决方案,这不是。


推荐阅读