代码之家  ›  专栏  ›  技术社区  ›  Armen Tsirunyan

匿名的空无标记类、结构、联合和枚举

  •  6
  • Armen Tsirunyan  · 技术社区  · 14 年前

    !免责声明! :请注意,我说的是 未标记的 声明。我知道这可能是一个非正式的术语,我的意思是声明不是typedef,也不声明匿名类型的对象。在这些情况下,一切都很清楚。

    问题1:
    下面哪一个是一个格式良好的C++程序?(多选)

    //One
    int main(){
       struct{}; //or class{}; should be the same
    }
    //Two  
    int main(){
       enum{}; 
    }
    //Three
    int main(){
       union{}; 
    }
    

    评论:
    MSVC9.0接受这三个选项。在第一位,它给出警告。在数字2和3上,我们得到0个错误和0个警告。在线COMEAU只接受数字3,数字1和数字2无法编译,并显示诊断消息“声明不声明任何内容”。如果在数字2中,匿名枚举包含至少一个枚举器,则COMEAU编译器正确地接受数字2。

    如果comeau编译器是正确的,并且这是标准行为,那么我会看到其中有一些不一致。我能理解为什么第一个应该被拒绝。我也理解为什么第二个应该被拒绝(什么都不声明),但在这种情况下,第三个也应该被拒绝。如果第三个不应该被拒绝,那么我看到与第一个不同的是,一个反常的联盟的成员的范围是外部的。但对于Enums也是这样,所以我的主张是,第三个应该被接受,第二个也应该被接受。

    问题2:
    如果Comeau是正确的,我在上述判断中遗漏了什么考虑?

    另外,我已经给Comeau支持部门写了一封电子邮件。我一拿到答案就把他们的答案贴出来。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Johannes Schaub - litb    14 年前