【问题标题】:Unusual syntax for a #define directive#define 指令的异常语法
【发布时间】:2021-12-31 19:39:58
【问题描述】:

在草图中我找到了以下说明:

#define USB_CONFIG_POWER_MA(mA)                ((mA)/2)

而且我想确保不要犯任何错误:为什么有两个“毫安”?

鉴于在此代码的先前版本中只需要这一行,我应该用一个值替换哪个:

#define USB_CONFIG_POWER_MA(20)

将最大值设置为 20mA 但现在它给出了编译错误:

/home/henry/arduino-1.8.16/hardware/arduino/avr/cores/arduino/USBCore.h:99:29: error: "20" may not appear in macro parameter list

这似乎是解决方案,因为它没有给我编译错误

#define USB_CONFIG_POWER_MA(mA) ((40)/2)

但我想再次确定!

【问题讨论】:

  • 我猜你从来不需要使用#define USB_CONFIG_POWER_MA(20),而只需要使用USB_CONFIG_POWER_MA(20)。前者没有定义任何替换文本

标签: c macros preprocessor


【解决方案1】:

#define USB_CONFIG_POWER_MA(mA)                ((mA)/2)

您定义了一个类似函数的宏,其中mA 是宏的参数

你可以像这样使用它:

printf("USB power for 20 mA is %d\n", USB_CONFIG_POWER_MA(20));

预处理器将这样替换宏:

printf("USB power for 20 mA is %d\n", ((20)/2));

如果您始终希望将宏替换为值 20,则可以定义一个类似函数的宏,忽略参数(这将向后兼容):

#define USB_CONFIG_POWER_MA(mA)                20

或定义一个不带参数的宏(这将需要您更改所有宏调用):

#define USB_CONFIG_POWER_MA                    20

后者不带参数,通常在 C 中用作定义符号常量的一种方式,因此在您的用例中更有意义。


另一种可能的解决方案是使用原始宏定义,但使用第二个宏来定义要作为参数传递的值:

#define USB_CONFIG_POWER_MA(mA)                ((mA)/2)
#define USB_CONFIG_DEFAULT_POWER               40

// ...

printf("USB power for 20 mA is %d\n",
       USB_CONFIG_POWER_MA(USB_CONFIG_DEFAULT_POWER));

这将是向后兼容的,并允许将其他值与原始 USB_CONFIG_POWER_MA 宏一起使用。

【讨论】:

  • 这不是我的代码。我是一个完全没有 C++ 经验的简单用户。只是另一个天真的问题。 #define USB_CONFIG_POWER_MA(mA) 20 是否等同于 #define USB_CONFIG_POWER_MA(mA) ((40)/2) ?只是为了确定
  • @FredDarkh 由于这不是您的代码,我建议您使用最后一个建议:不要修改原始宏,而是创建一个新的宏或其他符号常量,将其作为“参数”传递" 到原来的 USB_CONFIG_POWER_MA 宏。这将对原始代码的影响最小。
【解决方案2】:

将最大值设置为 20mA

您不应更改USB_CONFIG_POWER_MA 宏的定义,而应更改在使用它时传递给它的值。你说的宏来自USBCore.h

#define D_CONFIG(_totalLength,_interfaces) \
    { 9, 2, _totalLength,_interfaces, 1, 0, \
      USB_CONFIG_BUS_POWERED | USB_CONFIG_REMOTE_WAKEUP, \
      USB_CONFIG_POWER_MA(USB_CONFIG_POWER) }

您可以在此处看到用于设置配置功率的宏。再深入一点,USB_CONFIG_POWER 的定义是:

#ifndef USB_CONFIG_POWER
  #define USB_CONFIG_POWER      (500)
#endif

所以USB_CONFIG_POWER 只有在尚未定义的情况下才会被定义。这意味着您需要做的就是设置您的 Arduino 草图请求的功能,确保您在包含USBCore.h 文件之前自己定义USB_CONFIG_POWER。像这样写一行:

#define USB_CONFIG_POWER        (20)

在您的代码中包含该文件之前,您应该一切顺利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2011-09-11
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多