【问题标题】:How to initialize struct/class on the global scope如何在全局范围内初始化结构/类
【发布时间】:2012-05-10 07:55:02
【问题描述】:

我现在知道如何在全局范围内初始化结构。

以下是示例代码:

#include<GL/glut.h>
struct A
{
    int x;
};
struct A a;
a.x=6;
int main()
{}

我在 Ubuntu 11.10 上,当我编译这个程序时,我收到以下错误:

error: ‘a’ does not name a type

我不知道为什么会发生这种情况。我想知道如何将复杂的参数传递给某个回调函数?

非常感谢

【问题讨论】:

  • 尝试将作业移至主目录。包含 GL/glut.h 并没有什么特别之处 - 您观察到的错误与它无关。
  • 非常感谢....您能解释一下为什么我们不能这样做吗?内存已经分配给对象a,为什么不能修改呢?例如如果我们在 main 之外声明一个 vector M,我们可能会将几个元素 push_back 到 main 之外的 M 中。这两者有什么区别吗?
  • @mitweyl:因为那时不会定义操作顺序。分配是在调用构造之前还是之后发生的(在 C++ 的情况下)。在全局范围内只允许静态初始化。

标签: c++ c struct initialization


【解决方案1】:

我在 Ubuntu 11.10 上,当我编译这个程序时,我收到以下错误:错误:'a' 没有命名类型

编译器通过此消息告诉您,对结构成员的分配不能在全局范围内发生。如果你想初始化a 要么写

struct A a = {6};

或使用更新的语法

struct A a = {.x = 6};

或在程序启动后尽早进行初始化分配(即在 main 的开头)。

更新/编辑:

顺便说一句:这与 GLUT 或任何其他标题无关。这是语言规范的事情。

更新/编辑 2

我想知道如何将复杂的参数传递给某个回调函数?

好吧,在 GLUT 回调的情况下,这会很困难,因为 GLUT 不允许您指定用户定义的回调数据。您可以使用 ffcall 库来创建原位 closures,然后将其传递给 GLUT。但是有以下几点需要考虑:一旦你碰到这堵墙,就该放弃 GLUT。 GLUT 不是 OpenGL 开发的必要条件,也不是复杂应用程序的基础。所以就不要使用它了。

【讨论】:

  • 较新的语法也适用于 c++11,还是仅适用于 c99?
  • @BЈовић 它将在 C++ 20 中
【解决方案2】:

您正在执行任何函数之外的任务。在您的情况下,您只需移动一行代码即可获得以下内容:

#include<GL/glut.h>
struct A
{
    int x;
};
struct A a;
int main()
{
    a.x=6;
}

【讨论】:

    【解决方案3】:

    您观察到的问题与包括过剩无关。编译器不允许您为全局范围内的结构赋值。您可以通过调用结构的构造函数(在全局范围内允许)或在某些函数中调用赋值来实现您想要的。

    编辑:这是一个有点相关的讨论:Why can't I access my array subscript in global scope

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 2015-07-30
      • 1970-01-01
      • 2018-11-05
      • 2011-02-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多