2013-12-02 3 views
5

Во-первых код, который пугается мой ум:Typedef внутри C структуры

typedef struct Object { 
    typedef int MyInt; 
    void (*destructor)(Object *); 
    void *(*constructor)(struct Object *); 
} Object; 

Почему компилятор мешает мне определение ЬурейеЕ внутри структуры?

+2

т.к. C не C++. –

+0

Ну, я нашел нечто похожее в структурах данных ядра Windows, я считаю, что он находится в C [link] (http://msdn.microsoft.com/en-us/library/windows/hardware/ff550694%28v=vs.85% 29.aspx) – user2533527

+1

@ user2533527, это не то же самое. Этот typedef находится в глобальном масштабе (например, первый на посту Mic4ael), и это является законным и довольно распространенным явлением. Мы обсуждаем typedefs _inside_ a struct. – Guido

ответ

7

Этого просто не допускается. Что-то подобное допустимо в классах C++, но не в стандарте C.

+0

Обратите внимание на разницу между C-структурой и классом C++. Это более существенно, чем некоторые люди думают. – ciphermagi

1

Не знал, что это разрешено в C++, но я могу точно сказать, что я не видел, чтобы ванильский компилятор C принимал эту конструкцию.

Вот просматриваемый C99 грамматика, которая может с надеждой прояснить неясности: http://slps.github.io/zoo/c/iso-9899-tc3.html

Проверьте грамматику C++ 1998 для сравнения: http://slps.github.io/zoo/cpp/iso-14882-1998.html

5

В языке C каждое заявление в struct должен объявить поле данных (возможно, безымянного). Это означает, что можно определить типы внутри struct в C, если объявление нового типа встроено как часть объявления поля данных. Например

struct Outer { 
    struct Inner { 
    int i; 
    } field; 
}; 

struct Outer a; 
a.field.i = 42; 

В приведенном выше примере тип struct Inner объявляется внутри типа struct Outer. Однако объявление типа «вложенное» struct Inner никоим образом не локализовано внутри struct Outer. Он по-прежнему будет иметь размер файла, так как язык C не имеет такой области, как область struct. Это означает, что вы все еще можете использовать struct Inner в качестве члена одного и того же файла объем

struct Inner b; 
b.i = 42; 

Между тем, этот прием не применяется к typedef деклараций, поскольку typedef декларации не объявляют поля данных.

Обратите внимание, что в духе языка C, даже если ваша заявка typedef была как-то легальной, она все равно объявит имя typedef MojInt с объемом файла. То есть он будет вести себя точно так же, как если бы вы разместили объявление typedef до struct.

Смежные вопросы