2015-08-18 4 views
1

Что это выражение в виду:Typedef декларация с квадратными скобками

typedef char foo [FOO]; 

Я просто struggeling со значением выражения между квадратными скобками.

+0

Знаете ли вы, что означает 'char foo [8]'? – usr2564301

+0

Да, в этом случае foo - массив с 8 элементами, правильно? – Maximilian

+1

Да, и в typedef, foo - это * тип * массива с 8 элементами. Затем вы можете сделать 'foo a;', чтобы сделать 'a' массив (и путать всех об этом). –

ответ

5

Он читает foo является типом массива FOO -many char элементами. В этом случае FOO постоянная, определяемая где-то, как #define FOO 100

typedef int pair[2]; // Pair is an array of two ints. 
+0

да, но как массив может содержать элементы FOO-many, а FOO - это целая цепочка. – Maximilian

+1

@Maxi Найдите свой код для '#define FOO 100' или другого целочисленного литерала. Если вы не можете найти его нормально, запустите код через препроцессор ('gcc -E source.c') и посмотрите, как он определяется. FOO заменяется номером перед компиляцией источника. – mtijanic

+1

@ Maxi Действительно? Я сомневаюсь в этом. Если 'FOO' действительно строка, покажите ее в вопросе, вы должны где-то ее определить. –

4

C определений типов имеют основную форму typedef...type-declaration...имя-типа

В этом случае имя типа «Foo»

Тип сам по себе является массивом символов с размером FOO.

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

typedef...type-declaration...имя-типа [(необязательно постоянного)]

Если посмотреть в оригинале The C Programming Language в задней части, соответствующая часть читается как это: имя-типа

:
          типа спецификатор абстрактно-описатель

абстрактно-описатель:
          пустой
          (абстрактно-описатель)
          * абстрактно-описатель
          абстрактно-описатель()
          абстрактно-описатель [константа-выражение неавтоматического]

, где тип спецификатор может быть что-то вроде char, int или typedef (как в данном случае). Последний из 5 видов абстрактных-деклараторов - это декларатор массива, который имеет скобки после него. Обратите внимание, что он рекурсивный; так что abstract-declarator может быть указателем на abstract-declarator и т. д. и т. д.

+0

«C Typedefs имеют базовую форму' typedef ... type-declaration ... '* name-of-type *" - это очень упрощенное (и неправильное) представление typedefs. Например, 'typedef int * (* (* fptr) (void)) [N])' создает 'fptr' как имя типа для« указателя на функцию, возвращающего указатель на N-элементный массив указателя на 'int'». Синтаксически ключевое слово typedef обрабатывается как квалификатор класса хранения; придерживаться его перед * any * декларацией, и то, что было бы идентификатором в деклараторе, становится именем typedef. –

+0

@JohnBode Вот почему он говорит БАЗОВАЯ форма typedef, а не форма typedef. Я добавил описание грамматики из K & R, чтобы описать весь спектр различных возможностей. Часто, пытаясь понять что-то, вы хотите начать с самого простого случая и работать оттуда, а не бросать всю сложность у ученика вперед. –

+0

Это, интересно, все еще очень неполно, потому что это допустимый typedef: 'unsigned typedef char UCHAR;'. Хотя я согласен, что большинство людей должны работать только с самой базовой версией. :) – mtijanic