如果我写这个程序:
#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 ++会输出警告?
答案 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)
namespace
虽然在C结构中有自己的命名空间与其他类型分开
允许保持与C的向后兼容性。在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
}