如何在全局范围内初始化结构/类

Posted

技术标签:

【中文标题】如何在全局范围内初始化结构/类【英文标题】: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++ 的情况下)。在全局范围内只允许静态初始化。 【参考方案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

【讨论】:

以上是关于如何在全局范围内初始化结构/类的主要内容,如果未能解决你的问题,请参考以下文章

serversocket 类如何在同一个端口上服务多个客户端连接?

java 父类如何在运行期动态获取子类类名

外键和引用类如何在 Hibernate 实体中一起存在?

idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用

如何从全局范围调用 jquery 函数内的方法?

如何定义常量在全局范围内nodejs