2

如何获得以下代码以在 g++ 4.7 上编译?如果我放置内联的主体,它将编译foo,但我不希望它内联(因为真正的代码要复杂得多)。

struct A
{
  void foo();
} __attribute__((__may_alias__));

void A::foo() {}

int main() {return 0;}

错误:

/tmp/test.cpp:6:6: error: prototype for ‘void A::foo()’ does not match any in class ‘A’
/tmp/test.cpp:3:8: error: candidate is: void A::foo()
4

1 回答 1

1

将属性直接放在struct关键字之后:

struct __attribute__((__may_alias__)) A
{
  void foo();
};

void A::foo() {}

int main() {return 0;}

这适用于我的 g++4.7,而将它放在关闭之后会}产生与您得到的相同的错误。

gcc 文档

属性说明符列表可能作为struct,unionenum说明符的一部分出现。它可以紧跟在struct, unionorenum关键字之后,也可以在右大括号之后。前一种语法是首选。

(本段的其余部分可能会揭示潜在的问题是什么,以及为什么将属性放在成员规范之前会起作用。)

当您收到 [tumbleweed] 徽章时偶然发现了这个问题;)

于 2013-11-19T22:17:51.523 回答