Вопрос по c, c++, struct – Как инициализировать структуру / класс в глобальной области видимости

2

Теперь я знаю, как инициализировать структуры в глобальном масштабе.

Ниже приведен пример кода:

#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

Я понятия не имею, почему это могло произойти. Мне интересно, как передать сложный параметр в функцию обратного вызова?

большое спасибо

Большое спасибо .... не могли бы вы объяснить мне, почему мы не можем сделать таким образом? Память уже присвоена объекту А, почему мы не можем его изменить? И, например, если мы требуем вектор & lt; int & gt; M, вне main, мы можем отодвинуть несколько элементов в M вне main. Есть ли разница между этими двумя? mitweyl
@mitweyl: потому что порядок операций не будет определен тогда. Происходит ли присваивание до или после вызова конструкции (в случае C ++). В глобальном масштабе разрешена только статическая инициализация. datenwolf
попробуйте перенести задание на главную. В том числе GL / glut.h нет ничего особенного - наблюдаемая вами ошибка не имеет к этому никакого отношения. Ivaylo Strandjev

Ваш Ответ

3   ответа
2

And I am on Ubuntu 11.10, when I compile this program, I get the following errors: error: ‘a’ does not name a type

С этим сообщением компилятор сообщает, что назначения в члены структуры не могут происходить в глобальной области видимости. Если вы хотите инициализироватьa либо пиши

struct A a = {6};

или используя новый синтаксис

struct A a = {.x = 6};

или выполнить инициализацию в начале после запуска программы (т.е. в начале основного).

Update/EDIT:

Кстати: это не имеет ничего общего с GLUT или любым другим заголовком. Это спецификация языка.

Update/Edit 2

I am wondering how to pass a complex parameter to some callback function?

Что ж, в случае обратных вызовов GLUT это будет трудно, потому что GLUT не позволяет вам задавать пользовательские данные обратного вызова. Вы могли бы использоватьffcall библиотека для создания на местеclosures которые затем передаются в GLUT. Но следует учесть следующее: как только вы столкнетесь с этой стеной, пора отказаться от GLUT. GLUT не является обязательным требованием для разработки OpenGL и никогда не предназначался в качестве основы для сложных приложений. Так что просто не используйте его тогда.

Error: User Rate Limit Exceeded
0

Проблема, которую вы наблюдаете, не связана с перенасыщением. Компилятор не позволяет присваивать значение структуре в глобальной области видимости. Вы можете достичь того, что вы хотите, либо вызвав конструктор структуры (который будет разрешен в глобальной области видимости), либо вызвав присвоение в какой-либо функции.

РЕДАКТИРОВАТЬ: вот несколько связанных дискуссий:Почему я не могу получить доступ к своему индексу массива в глобальной области видимости?

0

переместить только одну строку кода, чтобы получить следующее:

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

Похожие вопросы