【问题标题】:Unbalanced parenthesis using __attribute__ in g++在 g++ 中使用 __attribute__ 的不平衡括号
【发布时间】:2012-05-16 02:52:43
【问题描述】:

今天我在我前段时间开发的一个项目上尝试了 clang。当它遇到编译错误时我很惊讶,因为我已经使用 g++ 成功编译了我的项目。

这个简短的 sn-p 重现了遇到错误的行:

int main() {
    __attribute__((aligned(16)) char arr[5];
}

产生此错误的原因:

test.cpp:2:32: error: expected ')'
    __attribute__((aligned(16)) char arr[5];
                               ^
                               )

如您所见,括号不平衡。有三个“(”和两个“)”。这显然看起来应该实际上会产生编译错误。

这是这个关键字的有效用法吗?我似乎在 the documentation 上找不到任何表明它是的东西。

我正在使用 g++ 4.5.2 和 clang 2.8。

请注意,当使用 gcc 而不是 g++ 时会检测到此错误。

【问题讨论】:

  • gcc documentation 声明 “关键字__attribute__ 允许您指定变量或结构字段的特殊属性。此关键字后跟双括号内的属性说明”。所以它并没有用精确的明确的话来说明以相同数量的括号结束,但所有 gcc 示例都显示匹配的括号,所以看起来像一个错误。
  • 是的,看起来它实际上是一个错误。我找不到任何可以表明相反的东西。
  • @DavidRodríguez-dribeas clang 支持它。我的意思是,看起来 g++ 确实没有正确解析该表达式。当在这里报告错误时,clang 正在做正确的事情(至少我怀疑是这样......这就是我问 :D 的原因)。
  • 我注意到char arr[5] __attribute__((aligned(16)); 在 g++ 上给出了正确的编译器错误。

标签: c++ c gcc compiler-errors


【解决方案1】:

这将是一个编译器错误。编译器看到__attribute__ 后跟两个左括号、一些其他标记和两个右括号,这可能是__attribute__ 应该是什么样子的“定义”,例如

::= __attribute__ '((' 某事'))'

我的猜测是中间的标记被解释为aligned(16,并且奇迹般地它仍然有效。

【讨论】:

  • 完美。我刚刚在 gcc 的 bugzilla 上报告了这个错误。
  • 是的,它与aligned() 的关系可能比与__attribute__ 的关系更大,因为__attribute__((packed) 无法编译。
  • 这可能不是一个错误,在我看来,这是因为不平衡的括号几乎不是你想要的,但如果 GCC 允许任何类型的标记出现在 (()) 中,那么它可能不被视为错误。试试__attribute__(( ( ( ( ( ( )),看看它是否抱怨未知属性而不是不平衡的括号。
  • 显然,这是2009年报告的错误,但尚未修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2011-12-15
相关资源
最近更新 更多