Упорядочение спецификаторов класса хранения (extern
, static
, register
, auto
, typedef
) относительно к типу спецификаторов (int
, double
, char
и т.д.) не имеет значения. Оба действительны и объявляют один и тот же объект.
Это, однако, считается хорошей практикой для соответствия определенному порядку. Список спецификатор-классификатор, который предшествует описатель (i
в вашем случае) состоит из отличительных групп ключевых слов, которые лучше всего используются в следующем порядке:
- спецификаторов класса хранения, если таковые имеются:
static
, extern
, auto
, register
, typedef
, _Thread_local
(C11);
- Типовые квалификаторы, если таковые имеются:
const
, , restrict
;
- Модификаторы типа, если таковые имеются:
signed
, unsigned
, short
, long
;
- Тип спецификатор:
int
, char
, double
, float
и т.д.
Следуя этому правилу приведет к более читаемых деклараций как это:
static const volatile unsigned long int a;
Вместо того, чтобы (крайний пример):
unsigned volatile int static const long a;
Только быстрое примечание здесь. Никто не пишет «auto» или «register» в коде C, написанном за последние 20 лет. Особенно «авто», поскольку он был перепрограммирован C++, чтобы означать что-то другое. – Art
@Art: вы хотите ... 15-летняя кодовая база, на которой я работаю каждый день, накладывается декларациями 'register' (обычно в спорных местах).(хотя я согласен с «авто», я никогда не видел его в реальном коде, даже плохой) –
@MatteoItalia Я должен был сказать что-то вроде «научился программировать за последние 20 лет», но это было бы неверно , Я видел недавно образованных людей, которые следовали практике каменного века, потому что они узнали от кого-то, кто узнал «все, что нужно знать» в 80-х годах. – Art