Typedef внутри структуры C

Прежде всего, код, который озадачивает мой разум:

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

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

Это просто запрещено. Нечто подобное разрешено в classах C ++ , но не в стандартном C.

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

 struct Outer { struct Inner { int i; } field; }; struct Outer a; a.field.i = 42; 

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

 struct Inner b; bi = 42; 

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

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

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

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

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