Можно ли указать спецификатор typedef в объявлении?
Синтаксис спецификатора typedef
:
typedef <existing_name> <alias_name>
например:
typedef long unsigned int Int;
Он отлично работает.
Но, если я помещаю typedef
в любом месте объявления, как это:
long unsigned typedef int Int;
Затем он также отлично работает.
Почему? Можем ли мы разместить typedef
в любом месте объявления?
Ответы
Ответ 1
Прежде всего, цитируя из раздела 6.11.5 "Направления будущего языка"
1 Размещение спецификатора класса хранения, отличного от начала спецификаторов объявления в объявлении, является устаревшей функцией.
Итак, не полагайтесь на это, поскольку это может быть удалено в будущем.
Тем не менее, чтобы понять, почему это работает, проверьте стандарт C11, глава §6.7.2:
[...] спецификаторы типов могут встречаться в любом порядке, возможно смешанные с другими спецификаторами декларации.
Из §6.7.1 мы знаем, что typedef
- спецификатор класса хранения (один конкретный вид спецификатора объявления), поэтому он может быть помещен после (или до) спецификатора типа (т.е. может быть смешанным), Это ничего не меняет.
Ответ 2
Это действительно разрешено стандартом C. typedef
- спецификатор класса хранения, и если вы посмотрите на грамматику, указанную в стандарте C (N1570, последний черновик для C11, §6.7 p1):
Синтаксис
Объявление:
, Объявление-спецификаторы init-declarator-list (opt);, static_assert декларация
Декларация спецификаторы:
, спецификатор-спецификатор класса хранилища (opt)
, Объявление-спецификатор спецификатора типа (opt)
, объявления-спецификаторы спецификатора типа (opt)
, Объявление спецификатора спецификации-спецификатора (opt)
, спецификаторы-указатели выравнивания (opt)
INIT-описатель-лист:
, INIT-описатель
, init-declarator-list, init-declarator
INIT-описатель:
, описатель
, declarator = инициализатор
спецификатор класса хранения может появляться после других спецификаторов объявлений, таких как спецификатор типа.
Но вы не должны использовать его, он устаревает, см. §6.11.5:
Размещение спецификатора класса хранения, отличного от начала декларации спецификаторы в декларации являются устаревшей функцией.