方法的声明改变了符号的含义

Posted

技术标签:

【中文标题】方法的声明改变了符号的含义【英文标题】:Declaration of method changes meaning of symbol 【发布时间】:2013-03-20 23:54:36 【问题描述】:

对于以下代码:

struct foo ;

struct A

    typedef foo foo_type;

    void foo();
;

GCC 给出编译器错误:

test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive]
     void foo();
              ^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive]
 struct foo ;
        ^

但是 clang 接受它并且没有编译器错误。谁是对的?

请注意,如果 typedef 被删除,或更改为typedef ::foo foo_type,gcc 和 clang 都会接受该代码。

【问题讨论】:

真正的问题是:为什么 Clang 总是正确的? 没有typedef的时候就不奇怪了 改用typedef ::foo foo_type; 试试。 @user315052:这也使错误消失了。我的问题仍然存在。 你也可以用typedef struct foo foo_type;“解决”它。如果您交换 typedef 和函数声明,行为会发生变化。 【参考方案1】:

gcc 是正确的,但 clang 不需要给出诊断(3.3.7):

在类 S 中使用的名称 N 应在其中引用相同的声明 上下文和在 S 的完整范围内重新评估时。否 违反此规则需要进行诊断。

这是因为类作用域的工作方式。 void foo();foo 在类A整个 范围内可见,因此void foo(); 的声明将typedef 中foo 的含义从引用@987654326 @ 到函数的名称foo

【讨论】:

以上是关于方法的声明改变了符号的含义的主要内容,如果未能解决你的问题,请参考以下文章

vb中符号常量的作用范围是啥?

&符号(&)在TypeScript类型定义中的含义是什么?

数学符号Sigma上下数字的含义

Linux中的特殊符号及含义

Linux文件权限符号含义

设计模式-UML类图的各符号含义(转)