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

Является ли "typedef" между типом и стандартным стандартом?

Я наткнулся на некоторый код, где ключевое слово typedef находится между типом и псевдоним, как в

int typedef INT;

Он компилируется в gcc и clang (живой пример). Я не очень хорошо разбираюсь в стандартах. Поэтому мой вопрос: соответствует ли это стандартное соответствие? Могу ли я полагаться на компиляторы для его поддержки?

4b9b3361

Ответ 1

Версия TL/DR

Да, int typedef INT соответствует.

Версия Джеймса Мишнера

Синтаксис декларации C (C 2011 онлайн-проект):

6.7 Объявления

Синтаксис

1     declaration:
        declaration-specifiers init-declarator-listopt ;
        static_assert-declaration

    declaration-specifiers:
        storage-class-specifier declaration-specifiersopt
        type-specifier declaration-specifiersopt
        type-qualifier declaration-specifiersopt
        function-specifier declaration-specifiersopt
        alignment-specifier declaration-specifiersopt
...

Это говорит о том, что в одном объявлении вы можете иметь последовательность из одного или нескольких спецификаторов деклараций, где каждый спецификатор объявления может быть спецификатором класса хранения (auto, extern, static, typedef), спецификатор типа (int, float, char и т.д.), определитель типа (const, restrict, volatile и т.д.), спецификатор функции (inline), или спецификатор выравнивания.

Порядок, в котором появляются различные спецификаторы, не имеет значения; static const short int x; может быть записано как int static short const x или int short const static x и т.д. На практике большинство людей сначала задают спецификатор класса хранения, затем любые спецификаторы функций или выравнивания (если необходимо), затем квалификаторы любого типа, затем спецификаторы типов, поэтому static const short int x - это то, как большинство людей напишет это объявление.

Этот синтаксис позволяет нам писать такие типы, как long double или long long или unsigned long int и т.д.

Обратите внимание, что хотя синтаксис допускает произвольные (и сколь угодно длинные) последовательности спецификаторов типов, существует семантическое правило, которое допускает только относительные числа. Вы не можете написать short short short short x, например, или long long long double y. Разрешены только следующие последовательности:

Ограничения

2     по меньшей мере один спецификатор типа должен указываться в спецификаторах объявления в каждом объявлении, и в списке спецификаторов-спецификаторов в каждой декларации структуры и имени типа. Каждый список спецификаторы типов должны быть одним из следующих мультимножеств (разделенных запятыми, когда более одного мультимножества на элемент); спецификаторы типов могут встречаться в любом порядке, возможно смешанные с другими спецификаторами декларации.
        - void
        - char
        - signed char
        - unsigned char
        - short, signed short, short int, or signed short int
        - unsigned short, or unsigned short int
        - int, signed, or signed int
        - unsigned, or unsigned int
        - long, signed long, long int, or signed long int
        - unsigned long, or unsigned long int
        - long long, signed long long, long long int, or
            signed long long int
        - unsigned long long, or unsigned long long int
        - float
        - double
        - long double
        - _Bool
        - float _Complex
        - double _Complex
        - long double _Complex
        - спецификатор атомного типа
        - конструктор или спецификатор объединения
        - спецификатор перечисления
          - typedef name

Добавление

Как указывает Кит в комментарии ниже, будущая переработка языка может ограничивать спецификаторы класса хранения до начала декларации, поэтому int typedef INT может не быть законным в будущем компиляторе.

Ответ 2

Ключевое слово typedef классифицируется как спецификатор класса хранения в C, хотя стандарт явно замечает, что это удобно для выражения формального синтаксиса языка. Тем не менее, следует, что typedef может отображаться точно в тех же местах, где может появиться любой другой спецификатор класса хранения, например extern или static. [C2011, 6.7.1/5]

Фактически, синтаксис позволяет спецификаторам класса хранения смешиваться с спецификаторами типов, классификаторами типов и другими "спецификаторами объявлений" в объявлениях. [C2011, 6.7/1, 6.7/6]

Таким образом, да, допустимо поставить ключевое слово typedef после имени типа, как в вашем примере.

Ответ 3

Если вы посмотрите на 7.1/1, вы увидите эту грамматику для decl-specifier:, которая показывает, что ключевое слово type-specifier и typedef попадает в одну и ту же точку грамматики, что позволяет вам их обменивать, как в вопросе (хотя, как ни в коем случае, никогда не пишите такой код, это вовсе не идиоматично).

Децл-спецификатора:

storage-class-specifier

type-specifier

function-specifier

friend

typedef

Ответ 4

Я скомпилирую, используя:

gcc -c -Wall -Wextra -pedantic -Wconversion -std = gnu99

В фоновом режиме это означает, что -Wold-style-declaration установлен.

Затем компилятор выводит следующее предупреждающее сообщение:

warning: 'typedef' is not a beginning of declaration [-Wold-style-declaration]

без установки этого параметра компилятор без проблем справляется с синтаксисом

Таким образом, опубликованный синтаксис находится в пределах стандарта, но может быть запутанным для читателя.

Ответ 5

typedef int INT

RightWay для использования typedef

Где бы вы ни использовали INT, он будет заменяться на int datatype

Эта основная цель - только для длинной строки данных для простого значения, но в этом случае вы можете использовать обычный int

Вы можете ретранслировать только для проверки использования цели тестирования, которую вы можете понять очень хорошо