Где используется ключевое слово C auto? - PullRequest
88 голосов
/ 03 февраля 2010

В студенческие годы я читал о ключевом слове auto и со временем действительно забыл, что это такое. Он определяется как:

определяет локальную переменную как имеющую местная жизнь

Я никогда не обнаруживал, что оно используется где-либо, действительно ли оно используется, и если да, то где и когда оно используется?

Ответы [ 8 ]

114 голосов
/ 03 февраля 2010

Если бы вы прочитали список IAQ (нечасто задаваемые вопросы), вы бы знали, что авто полезно в первую очередь для определения или объявления автомобиля:

auto my_car;

Транспортное средство, которое постоянно припарковано на открытом воздухе:

extern auto my_car;

Для тех, кто испытывает недостаток в чувстве юмора и хочет "только факты, мэм": краткий ответ заключается в том, что нет никакой причины использовать auto вообще. Единственный раз, когда вам разрешено использовать auto, это переменная, которая уже имеет класс хранения auto, так что вы просто указываете, что произойдет в любом случае. Попытка использовать auto для любой переменной, у которой уже нет класса хранения auto, приведет к тому, что компилятор отклонит ваш код. Я полагаю, если вы хотите получить техническую поддержку, ваша реализация не обязательно должна быть компилятором (но это так), и она может теоретически продолжать компилировать код после выдачи диагностики (но это не так).

Небольшое дополнение Каз :

Также есть:

static auto my_car;

, который требует диагностики в соответствии с ISO C. Это правильно, потому что это объявляет, что автомобиль сломался. Диагностика бесплатна, но выключение подсветки приборной панели обойдется вам в восемьдесят долларов. (Двадцать или меньше, если вы приобретете свой собственный USB-ключ для диагностики на платформе у eBay).

Вышеупомянутый extern auto my_car также требует диагностики, и по этой причине он никогда не запускается через компилятор, за исключением городского персонала, которому поручено обеспечение парковки.

Если вы видите много extern static auto ... в любой кодовой базе, вы находитесь в плохом районе; немедленно ищите лучшую работу, прежде чем все место превратится в Rust.

77 голосов
/ 03 февраля 2010

auto - это модификатор типа static.Он определяет класс хранения переменной.Однако, поскольку для локальных переменных по умолчанию используется значение auto, обычно его не нужно указывать вручную.

На этой странице перечислены различные классы хранения в C.

37 голосов
/ 19 июня 2014

Ключевое слово auto бесполезно на языке Си. Это происходит потому, что до языка C существовал язык B, в котором это ключевое слово было необходимо для объявления локальных переменных. (B был разработан в NB, который стал C).

Вот справочное руководство для B .

Как видите, руководство изобилует примерами, в которых используется auto. Это так, потому что нет ключевого слова int. Для того, чтобы сказать «это объявление переменной», требуется какое-то ключевое слово, и это ключевое слово также указывает, является ли оно локальным или внешним (auto против extrn). Если вы не используете одно или другое, у вас есть синтаксическая ошибка. То есть x, y; не является декларацией сам по себе, но auto x, y; является.

Поскольку кодовые базы, написанные на B, должны были быть портированы на NB и на C при разработке языка, более новые версии языка несли некоторый багаж для улучшения обратной совместимости, что переводило на меньшее количество работы. В случае auto программистам не приходилось выслеживать каждое вхождение auto и удалять его.

Из руководства очевидно, что теперь устаревшее "неявное int" Cruft в C (возможность писать main() { ... } без int впереди) также происходит от B. Это еще одна функция обратной совместимости для поддержки B-кода. Функции не имеют тип возвращаемого значения, указанный в B, потому что нет типов. Все слово, как во многих языках ассемблера.

Обратите внимание, как функцию можно просто объявить extrn putchar, а затем единственное, что делает ее функцией, для которой идентификатор использует : она используется в выражении вызова функции, например putchar(x), и вот что говорит компилятору обрабатывать это слово без типа как указатель на функцию.

22 голосов
/ 03 февраля 2010

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

Однако в стандарте C ++ 11 ключевое слово auto было «похищено» для поддержки вывода типа, где тип переменной может быть взят из типа ее инициализатора:

auto someVariable = 1.5;   // someVariable will have type double

Вывод типа добавляется в основном для поддержки объявления переменных в шаблонах или возврата из функций шаблона, когда типы, основанные на параметре шаблона (или выводимые компилятором при создании экземпляра шаблона), часто могут быть довольно болезненными для объявления вручную.

8 голосов
/ 16 ноября 2016

В старом компиляторе Aztec C можно было преобразовывать все автоматические переменные в статические (для увеличения скорости адресации) с помощью переключателя командной строки.

Но переменные, явно объявленные с auto, осталиськак в этом случае.(Обязательно для рекурсивных функций, которые в противном случае не работали бы должным образом!)

6 голосов
/ 04 мая 2017

Ключевое слово auto похоже на включение точек с запятой в Python, оно требовалось предыдущим языком (B), но разработчики поняли, что это избыточно, потому что большинство вещей было auto.

Я подозреваю, что он был оставлен, чтобы помочь с переходом с B на C. Одним словом, одно использование - для совместимости с языком B.

Например, в B и 80-х C:

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extrn putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}
0 голосов
/ 20 октября 2015

Ключевое слово Auto - это пример класса хранения (методика, определяющая время жизни переменной и места хранения). Это поведение, при котором переменная, созданная с помощью этого ключевого слова, имеет продолжительность жизни (время жизни), находящуюся только в фигурных скобках

{
    auto int x=8;        
    printf("%d",x);  // here x is 8

    { 
        auto int x=3;
        printf("%d",x);  // here x is 3
    }              

    printf("%d",x);  // here x is 8
}          
0 голосов
/ 07 ноября 2014

auto хорошо сказать, что вы не хотите, чтобы оно было register. Однако это часто бесполезно, так как компилятор поместит register, когда ни один из них не использовался, и он думает, что он оптимален, и он редко будет думать так неправильно, однако часто будет пропускать, что register является оптимальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...