Подтвердить что ты не робот

Почему мы не можем инициализировать элементы внутри структуры?

Почему мы не можем инициализировать элементы внутри структуры?

Пример:

struct s {
   int i = 10;
};
4b9b3361

Ответ 1

Если вы хотите инициализировать нестатические элементы в struct declare:

В С++ (не C), structs почти синонимичны классам и могут иметь элементы, инициализированные в конструкторе.

struct s {
    int i;

    s(): i(10)
    {
    }
};

Если вы хотите инициализировать экземпляр:

В C или С++:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99 также имеет функцию, называемую назначенными инициализаторами:

struct s {
    int i;
};

...

struct s s_instance = {
    .i = 10,
};

Существует также расширение GNU C, которое очень похоже на инициализаторы, назначенные C99, но лучше использовать что-то более портативное:

struct s s_instance = {
    i: 10,
};

Ответ 2

Прямой ответ заключается в том, что определение структуры объявляет тип, а не переменную, которая может быть инициализирована. Ваш пример:

struct s { int i=10; };

Это не объявляет какую-либо переменную - она ​​определяет тип. Чтобы объявить переменную, вы должны добавить имя между } и ;, а затем вы будете инициализировать его потом:

struct s { int i; } t = { 10 };

Как отмечали Checkers, на C99 вы также можете использовать назначенные инициализаторы (что является прекрасным улучшением - в один прекрасный день C догонит другие функции, которые Fortran 66 предоставил для инициализации данных, в первую очередь повторяя инициализаторы с определенным числом раз). С этой простой структурой нет никакой пользы. Если у вас есть структура с, скажем, 20 членами, и вам нужно только инициализировать один из них (скажем, потому что у вас есть флаг, указывающий, что остальная часть структуры инициализирована или нет), это более полезно:

struct s { int i; } t = { .i = 10 };

Эта нотация также может использоваться для инициализации союзов, чтобы выбрать, какой элемент объединения инициализирован.

Ответ 3

Изменить: Вопрос был первоначально помечен c++, но плакат сказал, что он относится к c, поэтому я снова пометил вопрос, я оставляю ответ, хотя...

В С++ a struct - это просто class, для которого по умолчанию используется public, а не private для членов и наследования.

С++ допускает инициализацию интегральных элементов static const, другие члены должны быть инициализированы в конструкторе или если struct является POD в списке инициализации (при объявлении переменной).

struct bad {
    static int answer = 42; // Error! not const
    const char* question = "what is life?"; // Error! not const or integral
};

struct good {
    static const int answer = 42; // OK
    const char* question;
    good() 
        : question("what is life?") // initialization list
        { }
};

struct pod { // plain old data
    int answer;
    const char* question;
};
pod p = { 42, "what is life?" };

Ответ 4

Обратите внимание, что в С++ 11 теперь разрешено следующее объявление:

struct s {
   int i = 10;
};

Это старый вопрос, но он занимает высокое место в Google и может также быть прояснен.

Ответ 5

Мы не можем инициализировать, потому что, когда мы объявляем какую-либо структуру, чем фактически то, что делаем, просто сообщайте компилятору об их присутствии. Если для этого не выделено выделение памяти, и если мы инициализируем элемент без памяти для этого. Обычно то, что происходит, когда мы инициализируем любую переменную, которая зависит от места, где мы объявили переменную компилятор, выделяем память для этой переменной.

int a = 10;
  • если он авто, чем в стеке, будет выделяться
  • если он глобальный, чем в области разделов данных, выделяется

Итак, какая память требуется для хранения этих данных, но в случае структуры нет памяти, поэтому ее невозможно инициализировать.

Ответ 6

Как вы сказали, это просто член, а не переменная. Когда вы объявляете переменную, компилятор также предоставляет пространство памяти для тех переменных, где вы можете поместить значения. В случае a элемента структуры компилятор не выделяет для него пространство памяти, поэтому вы не можете назначать значения членам структуры, если вы не создаете переменную этого типа структуры.