Подтвердить что ты не робот

Можно ли указать спецификатор typedef в объявлении?

Синтаксис спецификатора typedef:

typedef <existing_name> <alias_name>

например:

typedef long unsigned int Int;

Он отлично работает.

Но, если я помещаю typedef в любом месте объявления, как это:

long unsigned typedef int Int;

Затем он также отлично работает.

Почему? Можем ли мы разместить typedef в любом месте объявления?

4b9b3361

Ответ 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:

Размещение спецификатора класса хранения, отличного от начала декларации спецификаторы в декларации являются устаревшей функцией.