В студенческие годы я читал о auto
ключевом слове и со временем забыл, что это такое. Это определяется как:
определяет локальную переменную как имеющую локальное время жизни
Я никогда не обнаружил, что он где-то используется, действительно ли он используется, и если да, то где и в каких случаях?
auto
можно указать, но не произойдет по умолчанию?auto
. tigcc.ticalc.org/doc/keywords.html#auto_Thread_local
подробности: en.cppreference.com/w/c/language/storage_duration и stackoverflow.com/a/14289720/6557621Если вы читали список часто задаваемых вопросов ( IAQ ), вы бы знали, что auto полезен в первую очередь для определения или объявления транспортного средства:
Автомобиль, который постоянно припаркован на открытом воздухе:
Для тех, у кого нет чувства юмора и кто хочет «только факты, мэм»: краткий ответ: нет никаких причин для использования
auto
вообще. Единственный раз, когда вам разрешено использовать,auto
- это переменная, у которой уже естьauto
класс хранения, поэтому вы просто указываете что-то, что все равно произойдет. Попытка использоватьauto
любую переменную, у которой еще нетauto
класса хранения, приведет к тому, что компилятор отклонит ваш код. Я полагаю, если вы хотите получить техническую информацию, ваша реализация не обязательно должна быть компилятором (но это так), и теоретически она может продолжать компилировать код после выдачи диагностики (но это не так).Небольшое дополнение от kaz :
А также есть:
который требует диагностики в соответствии с ISO C. Это правильно, потому что он заявляет, что автомобиль сломался. Диагностика проводится бесплатно, но выключение подсветки приборной панели обойдется вам в восемьдесят долларов. (Двадцать или меньше, если вы приобретете собственный USB-ключ для бортовой диагностики на eBay).
Вышеупомянутое
extern auto my_car
также требует диагностики, и по этой причине она никогда не запускается через компилятор, кроме как городским персоналом, которому поручено следить за парковкой.Если вы видите много
extern static auto ...
кода в любой базе, значит, вы находитесь в плохом районе; немедленно ищите работу получше, пока все не превратилось в Rust.источник
char auto my_car;
auto
Ключевое слово бесполезно в языке Си. Это связано с тем, что до языка C существовал язык B, в котором это ключевое слово было необходимо для объявления локальных переменных. (B был преобразован в NB, который стал C).Вот справочное руководство для B .
Как видите, руководство изобилует примерами, в которых
auto
используется. Это потому, что нетint
ключевого слова. Требуется какое-то ключевое слово, чтобы сказать «это объявление переменной», и это ключевое слово также указывает, является ли оно локальной или внешней (поauto
сравнению сextrn
). Если вы не используете один или другой, у вас есть синтаксическая ошибка. То естьx, y;
само по себе не декларация, аauto x, y;
есть.Поскольку кодовые базы, написанные на B, приходилось переносить на NB и на C по мере разработки языка, новые версии языка несли некоторый багаж для улучшенной обратной совместимости, что привело к уменьшению объема работы. В случае с
auto
, программистам не нужно было выслеживать каждое появлениеauto
и удалять его.Из руководства очевидно, что устаревшее "неявное int" в C (возможность писать
main() { ... }
без каких-либо предварительных данныхint
) также исходит от B. Это еще одна функция обратной совместимости для поддержки кода B. Функции не имеют типа возвращаемого значения, указанного в B, потому что нет типов. Все - словом, как и во многих языках ассемблера.Обратите внимание , как функция только может быть объявлена
extrn putchar
и тогда единственное , что делает его функция, идентификатор в использовании : он используется в выражении вызова функции , какputchar(x)
, и это то, что заставляет компилятор лечить , что бестиповое слово как указатель на функцию.источник
В C
auto
- ключевое слово, указывающее, что переменная является локальной для блока. Поскольку это значение по умолчанию для переменных с блочной областью видимости, оно не требуется и используется очень редко (не думаю, что когда-либо видел его использование вне примеров в текстах, где обсуждается ключевое слово). Мне было бы интересно, если бы кто-нибудь мог указать на случай, когда использованиеauto
было необходимо для получения правильного синтаксического анализа или поведения.Однако в стандарте C ++ 11
auto
ключевое слово было «перехвачено» для поддержки вывода типа, когда тип переменной может быть взят из типа ее инициализатора:Вывод типа добавляется в основном для поддержки объявления переменных в шаблонах или возвращаемых из функций шаблона, где типы, основанные на параметре шаблона (или выведенные компилятором при создании экземпляра шаблона), часто может быть довольно болезненным для объявления вручную.
источник
auto
касается класса хранения, который не имеет ничего общего с видимостью.В старом компиляторе Aztec C все автоматические переменные можно было преобразовать в статические (для увеличения скорости адресации) с помощью переключателя командной строки.
Но в этом случае переменные, явно объявленные с помощью,
auto
были оставлены как есть. (Обязательно для рекурсивных функций, которые иначе не работали бы должным образом!)источник
auto
Ключевое слово аналогично включение в Python с запятой, требовались от предыдущего языка (B
) , но разработчики поняли , что это было излишним , так как большинство вещей былиauto
.Я подозреваю, что его оставили, чтобы помочь с переходом с B на C. Короче говоря, одно использование - для совместимости с языком B.
Например, в B и 80-х C:
источник
Ключевое слово Auto - это пример класса хранения (своего рода методы, которые определяют время жизни переменной и место хранения). У него есть поведение, при котором переменная, созданная с помощью этого ключевого слова, имеет продолжительность жизни (время жизни), находится только в фигурных скобках.
источник
auto
может использоваться только для переменных с блочной областью видимости.extern auto int
- это мусор, потому что компилятор не может определить, использует ли он внешнее определение или следует ли переопределить extern с помощью автоматического определения (также auto и extern - это совершенно разные сроки хранения, напримерstatic auto int
, что также очевидно является мусором). Он всегда может интерпретировать его одним способом, но вместо этого предпочитает рассматривать его как ошибку.Есть одна функция, которая
auto
действительно обеспечивает, и это включение правила «все является int» внутри функции. В отличие от функции вне функции, гдеa=3
интерпретируется как определение,int a =3
потому что присваивания не существуют в области файла,a=3
это ошибка внутри функции, поскольку, очевидно, компилятор всегда интерпретирует ее как присвоение внешней переменной, а не определение (даже если есть нетыextern int a
форвардных деклараций в функции или в области файла), но спецификатор , какstatic
,const
,volatile
илиauto
будет означать , что это определение и компилятор принимает его в качестве определения, за исключением того,auto
не имеет побочные эффекты других спецификаторов.auto a=3
поэтому неявноauto int a = 3
. По общему признанию,signed a = 3
имеет тот же эффект иunsigned a = 3
всегда представляет собой целое число без знака.Также обратите внимание: «
auto
не влияет на то, будет ли объект помещен в регистр (если какой-то конкретный компилятор не обратит на это внимания, но это кажется маловероятным)»источник
Я уверен, что вы знакомы со спецификаторами класса хранения в C, такими как «extern», «static», «register» и «auto». Определение «auto» в значительной степени дается в других ответах, но вот возможное использование ключевого слова «auto», в котором я не уверен, но я думаю, что это зависит от компилятора. Видите ли, в отношении спецификаторов класса хранения есть правило. Мы не можем использовать несколько спецификаторов класса хранения для переменной. Вот почему статические глобальные переменные не могут быть извлечены. Следовательно, они известны только своему досье. Когда вы переходите к настройке вашего компилятора, вы можете включить флаг оптимизации для скорости. один из способов оптимизации компилятора: он ищет переменные без спецификаторов класса хранения, а затем делает оценку на основе доступности кэш-памяти и некоторых других факторов, чтобы увидеть, следует ли обрабатывать эту переменную с использованием спецификатора регистра или нет. Теперь, что, если мы хотим оптимизировать наш код для повышения скорости, зная, что конкретная переменная в нашей программе не очень важна, и мы не хотим, чтобы компилятор даже рассматривал ее как регистр. Хотя, если поставить auto, компилятор не сможет добавить спецификатор регистра в переменную, так как набирает "register auto int a;" ИЛИ "автоматическая регистрация int a;" вызывает ошибку использования нескольких спецификаторов класса хранения. Подводя итог, я подумал, что auto может запретить компилятору обрабатывать переменную как регистр посредством оптимизации. что, если мы хотим оптимизировать наш код для повышения скорости, зная, что конкретная переменная в нашей программе не очень важна, и мы не хотим, чтобы компилятор даже рассматривал ее как регистр. Хотя, если поставить auto, компилятор не сможет добавить спецификатор регистра в переменную, так как набирает "register auto int a;" ИЛИ "автоматическая регистрация int a;" вызывает ошибку использования нескольких спецификаторов класса хранения. Подводя итог, я подумал, что auto может запретить компилятору обрабатывать переменную как регистр посредством оптимизации. что, если мы хотим оптимизировать наш код для повышения скорости, зная, что конкретная переменная в нашей программе не очень важна, и мы не хотим, чтобы компилятор даже рассматривал ее как регистр. Хотя, если поставить auto, компилятор не сможет добавить спецификатор регистра в переменную, так как набирает "register auto int a;" ИЛИ "автоматическая регистрация int a;" вызывает ошибку использования нескольких спецификаторов класса хранения. Подводя итог, я подумал, что auto может запретить компилятору обрабатывать переменную как регистр посредством оптимизации. вызывает ошибку использования нескольких спецификаторов класса хранения. Подводя итог, я подумал, что auto может запретить компилятору обрабатывать переменную как регистр посредством оптимизации. вызывает ошибку использования нескольких спецификаторов класса хранения. Подводя итог, я подумал, что auto может запретить компилятору обрабатывать переменную как регистр посредством оптимизации.
Эта теория не работала для компилятора GCC, однако я не пробовал другие компиляторы.
источник