带有成员函数的G ++ may_alias

时间:2013-10-24 17:39:36

标签: c++ g++-4.7 gcc-extensions

如何在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()

1 个答案:

答案 0 :(得分:1)

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

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

void A::foo() {}

int main() {return 0;}

这适用于我的g ++ 4.7,而在结束}之后放置它会产生与你相同的错误。

来自gcc documentation

  

属性说明符列表可能会显示为structunionenum说明符的一部分。它可以在structunionenum关键字之后立即执行,也可以在结束括号之后执行。以前的语法是首选。

(该段的其余部分可能会揭示底层问题是什么,以及在将属性放在成员规范之前它的工作原理。)

当你收到[风滚草]徽章时偶然发现这个问题;)