如何在全局范围内初始化结构/类
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我在 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 类如何在同一个端口上服务多个客户端连接?
idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用