Что это выражение в виду:Typedef декларация с квадратными скобками
typedef char foo [FOO];
Я просто struggeling со значением выражения между квадратными скобками.
Что это выражение в виду:Typedef декларация с квадратными скобками
typedef char foo [FOO];
Я просто struggeling со значением выражения между квадратными скобками.
Он читает foo
является типом массива FOO
-many char
элементами. В этом случае FOO
постоянная, определяемая где-то, как #define FOO 100
typedef int pair[2]; // Pair is an array of two ints.
да, но как массив может содержать элементы FOO-many, а FOO - это целая цепочка. – Maximilian
@Maxi Найдите свой код для '#define FOO 100' или другого целочисленного литерала. Если вы не можете найти его нормально, запустите код через препроцессор ('gcc -E source.c') и посмотрите, как он определяется. FOO заменяется номером перед компиляцией источника. – mtijanic
@ Maxi Действительно? Я сомневаюсь в этом. Если 'FOO' действительно строка, покажите ее в вопросе, вы должны где-то ее определить. –
C определений типов имеют основную форму typedef...type-declaration...
имя-типа
В этом случае имя типа «Foo»
Тип сам по себе является массивом символов с размером FOO.
Сложная часть состоит в том, что скобки являются после название, поэтому в смысле декларация находится с обеих сторон символа, который будет представлять тип. Это причуда объявлений массива, которые могут иметь скобки после их имени. Таким образом, в этом случае синтаксис выглядит так:
typedef...type-declaration...
имя-типа [(необязательно постоянного)]
Если посмотреть в оригинале The C Programming Language в задней части, соответствующая часть читается как это: имя-типа
:
типа спецификатор абстрактно-описательабстрактно-описатель:
пустой
(абстрактно-описатель)
* абстрактно-описатель
абстрактно-описатель()
абстрактно-описатель [константа-выражение неавтоматического]
, где тип спецификатор может быть что-то вроде char
, int
или typedef
(как в данном случае). Последний из 5 видов абстрактных-деклараторов - это декларатор массива, который имеет скобки после него. Обратите внимание, что он рекурсивный; так что abstract-declarator может быть указателем на abstract-declarator и т. д. и т. д.
«C Typedefs имеют базовую форму' typedef ... type-declaration ... '* name-of-type *" - это очень упрощенное (и неправильное) представление typedefs. Например, 'typedef int * (* (* fptr) (void)) [N])' создает 'fptr' как имя типа для« указателя на функцию, возвращающего указатель на N-элементный массив указателя на 'int'». Синтаксически ключевое слово typedef обрабатывается как квалификатор класса хранения; придерживаться его перед * any * декларацией, и то, что было бы идентификатором в деклараторе, становится именем typedef. –
@JohnBode Вот почему он говорит БАЗОВАЯ форма typedef, а не форма typedef. Я добавил описание грамматики из K & R, чтобы описать весь спектр различных возможностей. Часто, пытаясь понять что-то, вы хотите начать с самого простого случая и работать оттуда, а не бросать всю сложность у ученика вперед. –
Это, интересно, все еще очень неполно, потому что это допустимый typedef: 'unsigned typedef char UCHAR;'. Хотя я согласен, что большинство людей должны работать только с самой базовой версией. :) – mtijanic
Знаете ли вы, что означает 'char foo [8]'? – usr2564301
Да, в этом случае foo - массив с 8 элементами, правильно? – Maximilian
Да, и в typedef, foo - это * тип * массива с 8 элементами. Затем вы можете сделать 'foo a;', чтобы сделать 'a' массив (и путать всех об этом). –