Грамматика для спецификаторов объявлений приведена в C 2018 6.7 1, и она показывает, что спецификаторы для класса хранения (например, static
), типа (например, short
или double
), квалификаторов (например, как const
), функции (inline
и _Noreturn
) и выравнивание могут отображаться в любом порядке. Ничто в пункте 6.7 не дает никакого значения порядку, в котором появляются спецификаторы, поэтому мы можем предположить, что любая комбинация спецификаторов имеет одинаковое значение независимо от порядка.
Единственное упоминание «порядка» в этом отношении встречается в 6.7.2 2, где говорится: «… спецификаторы типа могут встречаться в любом порядке, возможно, смешанными с другими спецификаторами объявления». Таким образом, вы можете написать long static int const long
для static const long long int
, точно так же, как вы можете сказать «квадратный красный большой дом» вместо «большой квадратный красный дом» - нет никаких правил против этого, но это будет показаться смешным людям и может их скинуть.
Обратите внимание, что *
, который указывает указатель, а также (
и )
для групп или списков аргументов и [
и ]
для индексы не являются спецификаторами декларации и не могут быть свободно переупорядочены с помощью спецификаторов декларации. (На самом деле они являются частью декларатора , который является отдельной частью декларации от спецификаторов объявлений .)