Разница между struct S {int align;};(имя после ключевого слова struct) и struct {int align;} S;(имя после определения структуры) - PullRequest
0 голосов
/ 25 октября 2018
#include <stdio.h>

struct Header
{
    unsigned long long int alignment;
};

int main(void)
{
    struct Header header;  // note: we can loose the 'struct' in C++
    struct Header* pheader = &header;

    return 0;
}

Вышеприведенная программа прекрасно компилируется как на C, так и на C ++.

Но когда я изменяю структуру заголовка на:

struct {
    unsigned long long int alignment;
} Header;

, происходит сбой со следующим сообщением на C:error: storage size of ‘Header’ isn’t known

и в C ++: error: aggregate ‘main()::Header header’ has incomplete type and cannot be defined struct Header header;

Аналогичная структура используется в реализации Storage Allocator в книге по языку программирования C от K & R.Я думал, что это то же самое, но я узнаю, что это не так.С тех пор я видел и в других местах.Я конечно больше знаком с первой версией.Что означает второй и почему он вообще существует?В чем разница?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

struct Header {}; представляет тип struct с именем Header.

typedef struct {} Header; вводит анонимный тип структуры и псевдоним Header для этого анонимного типа.

struct {} Header; вводит как анонимный тип структуры, так и переменную с именем Header анонимного типа.

Когда нет типа с именем Header (последний случай), struct Header header; вводит structтип с именем Header без тела, затем пытается создать переменную header этого типа.

0 голосов
/ 25 октября 2018

Проще говоря, компилятор видит «Заголовок» и не имеет предыдущего или встроенного типа данных «Заголовок», поэтому он не знает, что это такое.Когда вы используете

typedef struct header {
    ....
} Header;

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

0 голосов
/ 25 октября 2018

Когда вы компилируете часть ниже

struct {
    unsigned long long int alignment;
} Header;

struct не имеет тега , это называется анонимная структура тип.при этом

struct Header header;

компилятор выдает ошибку типа

Заголовок заголовка 'имеет неполный тип и не может быть определен struct Заголовок заголовка

Следовательно, в этихслучаях лучше 1018 struct.Например,

typedef struct {
    unsigned long long int alignment;
} Header;
...