【问题标题】:Are Multiline macros in GCC supported是否支持 GCC 中的多行宏
【发布时间】:2010-01-20 04:55:47
【问题描述】:

在 gcc 版本 3.2.4 中是否支持(可编译)多行宏。我正在尝试使用上述 gcc 版本在 linux 主机上构建具有多行宏的源。 我在宏处遇到编译错误,它是多行的。

      #define YYCOPY(To, From, Count)       \
      do                    \
     {                  \
       YYSIZE_T yyi;                \
       for (yyi = 0; yyi < (Count); yyi++)  \
         (To)[yyi] = (From)[yyi];       \
     }                  \
      while (0)

如果它们不受支持,解决方法是什么,将宏转换为函数或其他一些编译器选项会有所帮助?

谢谢。

-AD

【问题讨论】:

  • “多行宏”到底是什么意思? do { ... } while(0) 技巧对您不起作用吗? c-faq.com/cpp/multistmt.html
  • @goldenmean:你能告诉我们实际的代码吗?你是如何定义你的宏的?
  • @Alok:代码实际上使用通常的 do while 构造实现了这个宏,以避免与分号相关的编译错误:do { ...//宏中的一些语句 ...//宏中还有一些语句 } while(0)
  • @Alok:下面是代码。对不起,如果格式不好:#define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi
  • 您也应该告诉我们您遇到的错误。

标签: gcc macros multiline


【解决方案1】:

继续宏的反斜杠是标准预处理器。检查反斜杠后是否有多余的空格或其他不可见字符。

【讨论】:

  • @ergosys:它有反斜杠、一个 do while 循环和这个多行宏中使用的一些其他宏。
【解决方案2】:

ANSI C 规范要求编译器支持这一点——具体来说,该标准规定,如果一行在换行符之前以反斜杠结尾,则预处理器将该行和后续行视为一个逻辑行,就像反斜杠和换行符都不存在。如果一个预处理器不这样做,它就不是一个符合标准的预处理器(或者更专业地说,一个翻译器,正如标准所称的那样)。

GCC 力求尽可能地符合 ANSI C 标准。是的,它支持在行尾使用反斜杠定义的多行宏。

您收到编译器错误的原因是别的。您没有正确使用宏。如果不发布您收到的确切错误消息和调用宏的代码,就不可能说出您做错了什么。

【讨论】:

    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 2010-12-16
    • 2014-01-02
    • 1970-01-01
    • 2018-08-04
    • 2020-12-22
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多