使用可选的'struct'关键字时的g ++警告

时间:2011-06-01 20:52:06

标签: c++ namespaces struct g++ compiler-warnings

如果我写这个程序:

#include <iostream>

namespace foo {
    struct bar {
        int x;
    };
}

int main (void) {
    struct foo::bar *a = new struct foo::bar;
    delete a;
    return 0;
}

并使用以下命令编译:

g++ main.cxx -Wall -Wextra

它给了我这个警告:

main.cxx: In function ‘int main()’:
main.cxx:10:39: warning: declaration ‘struct foo::bar’ does not declare anything [enabled by default]

但是,如果我在struct关键字后面取出new关键字:

#include <iostream>

namespace foo {
    struct bar {
        int x;
    };
}

int main (void) {
    struct foo::bar *a = new foo::bar;
    delete a;
    return 0;
}

以相同的方式编译它,g ++不输出任何警告。如果我使用struct关键字,为什么g ++会输出警告?

4 个答案:

答案 0 :(得分:5)

在C ++中,struct关键字定义了一种类型,新类型不再需要struct关键字。这是C和C ++之间的众多差异之一。

答案 1 :(得分:3)

检查错误:

  

main.cxx:10:39:警告:声明‘struct foo::bar’未声明任何内容[默认启用]

g ++认为您声明了一个名为struct的新foo::bar,而不是分配struct foo::bar类型的内存。我的猜测是因为g ++假定使用struct而没有声明左值是为了声明一个类型。

答案 2 :(得分:2)

发布最小的代码,但没有说明问题:

namespace N {
struct A {};
}

struct B {};

int main() {
    struct N::A * a  = new struct N::A; // problem
    struct B * b  = new struct B;       // ok
}

就我个人而言,我认为这是一个小的GCC错误,但我对命名空间的无数方式并不明智。

答案 3 :(得分:1)

注意:

   struct foo::bar *a = new struct foo::bar;
// ^^^^^^ (1)
                        //  ^^^^^^ (2)
  1. C ++中不需要
    • 将结构放在这里是C的宿醉,在C ++中不再需要了 因为所有类型都在同一个namespace 虽然在C结构中有自己的命名空间与其他类型分开 允许保持与C的向后兼容性。
  2. struct在这里看起来像是向前声明的东西。
  3. 在C ++中,上面写的是:

       foo::bar* a = new foo::bar;
    

    //或者最好

       foo::bar* a = new foo::bar(); // This makes a difference if you don't define
                                     // a default constructor.
    

    来自大卫(下)

    重要的是我认为它需要在答案而不是评论中:

    namespace foo
    {
        struct bar {};
        void bar() {}
    }
    
    int main()
    {
        struct foo::bar* p = new struct foo::bar;
        // Needed here because the compiler can't tell the difference between
        // a struct and a function otherwise
    }