【问题标题】:Unexpected syntax error during macro expansion宏扩展期间出现意外的语法错误
【发布时间】:2019-05-02 16:59:46
【问题描述】:

我在尝试使用条件编译时遇到以下错误,如下所示: 注意:请注意,ONE、TWO 和 THREE 是预处理器定义的符号,而 THREE 是宏,使用的编译器是 IAR (IDE AtmelStudio)

  1. 为 ((defined(ONE)) 添加了额外的括号,并且可能用于两个和三个
  2. 尝试包含一个仅带有 ) 的 #else 块,并将附加的 ) 放在 #if (SUM) 下的语句末尾

#if (defined(ONE) && !defined(TWO)
      #if (SUM)
         && !defined(THREE)   
      #endif
         )
    some_statements_1
    #else
    some_statements_2
    #endif /* #if (defined(ONE) && !defined(TWO) */

我希望 some_statements_1 仅在定义 ONE 时执行 TWO 未定义并且 案例 1: 如果 SUM 设置为 > 0,则不应定义 THREE 案例 2: 如果 SUM 设置为 0,则照常(不检查 THREE

实际结果是:

Pe018: expected a ")" at line 1 and
error: Pe169: expected a declaration at line 3

【问题讨论】:

  • 宏不跨越行边界。长宏可以使用 '\' 将多行合二为一。
  • 我已经尝试在除最后一行之外的每一行的末尾插入 \,但唯一的结果是(相同的)语法错误显示在第 2 行而不是第 1 行
  • ONETWOTHREE 定义为什么?
  • SUM 是宏还是运行时变量?如果它是运行时的,那么这根本不起作用。您需要在编译时还是运行时做出决定?

标签: c c-preprocessor


【解决方案1】:

预处理器条件行上的表达式需要是自包含的。您不能将#if 放在预处理器表达式的中间。

试试:

#if defined(ONE) && !defined(TWO) && !((SUM) && defined(THREE))
     some_statements_1
#else
     some_statements_2
#endif

我假设SUM 是一个宏,它扩展为适合预处理器求值的整数常量表达式。

(已编辑:是#if defined(ONE) && !defined(TWO) && (!(SUM) || defined(THREE))

【讨论】:

  • 我不确定#if 不能像我之前所做的那样放在预处理器表达式中间的语句。关于您提供的示例代码,我同意您提供的代码在逻辑上应该是正确的,但我的要求就像 SUM 就像一个可以使用其他机制在外部禁用的标志。所以我的实际意图是如果设置了标志,然后再添加一个条件来执行语句,否则不。
  • @user7083883 SUM 应该是什么样的标志?当您说“外部禁用”时,您是指在编译时禁用还是在运行时禁用?
  • 好的,SUM 是一个基于 XML 文件的自动生成的宏。天真的用户可以通过编辑 xml 来启用/禁用标志,这将在自动生成的头文件中将 FLAG 定义为 1/0(编译前)
  • @user7083883 另外,我重申您不能将#if 放在预处理器表达式的中间。证明我是错的。 (“预处理器表达式”是指在 #if#elif 指令中合法的常量表达式。)
  • @user7083883 例如?
【解决方案2】:

if (defined(ONE) && !defined(TWO)

在上面的陈述中,你错过了一个右括号。请添加它

【讨论】:

  • 这是正确的,但你应该指出他缺少的换行符,因为他显然有它,但在另一行
猜你喜欢
  • 2013-12-08
  • 2020-09-10
  • 1970-01-01
  • 2023-01-20
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多