1

要在 main() 之外的函数中使用结构,可以使用前向声明并在 main() 中定义它,还是必须在块之外定义?

4

1 回答 1

4

如果在 中定义结构main(),它将隐藏结构的全局名称。所以外面的函数main()只能引用全局名称。此示例取自 C++ 2011 草案,第 9.1 节 p2:

struct s { int a; };

void g() {
    struct s;              // hide global struct s
                           // with a block-scope declaration
    s* p;                  // refer to local struct s
    struct s { char* p; }; // define local struct s
    struct s;              // redeclaration, has no effect
}

没有语法可以从函数范围之外引用本地定义的类型。因此,即使使用模板也会失败,因为无法表达模板的实例化:

template <typename F> void bar (F *f) { f->a = 0; }

int main () {
    struct Foo { int a; } f = { 3 };
    bar(&f);                         // fail in C++98/C++03 but ok in C++11
}

实际上,这在 C++11 中现在是允许的,正如这个答案中所解释的那样。

于 2012-09-19T02:21:46.467 回答