2016-09-05 4 views
0

Я знаю о классах хранения в C. Мне интересно о ключевое слово auto.Проблема с автоматической переменной

В следующем выражении,

auto int i = 0; 

auto является класс хранения спецификатор, int является типом данных.

Но если мы пишем:

int auto i = 0; 

Что происходит? auto ведет себя как тип данных?

+5

Только быстрое примечание здесь. Никто не пишет «auto» или «register» в коде C, написанном за последние 20 лет. Особенно «авто», поскольку он был перепрограммирован C++, чтобы означать что-то другое. – Art

+0

@Art: вы хотите ... 15-летняя кодовая база, на которой я работаю каждый день, накладывается декларациями 'register' (обычно в спорных местах).(хотя я согласен с «авто», я никогда не видел его в реальном коде, даже плохой) –

+1

@MatteoItalia Я должен был сказать что-то вроде «научился программировать за последние 20 лет», но это было бы неверно , Я видел недавно образованных людей, которые следовали практике каменного века, потому что они узнали от кого-то, кто узнал «все, что нужно знать» в 80-х годах. – Art

ответ

6

Упорядочение спецификаторов класса хранения (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; 
4

С помощью грамматики C вы можете указать место хранения er в обеих позициях, нет никакой двусмысленности, поскольку пересечение между набором допустимых типов допустимыми спецификаторами хранения пусто. Однако обычно я всегда видел спецификатор хранилища, написанный перед типом, поэтому вы, вероятно, должны придерживаться этого соглашения для удобства чтения другими людьми.

(также, избегать использования auto, никто никогда не использует это, потому что всегда подразумевается, к тому, что C++ даже адаптированного, что ключевое слово для переменных с выведенной типа)

Смежные вопросы