Написать пост

auto в C

Аватар Типичный программист

Вопрос

Почему строка auto a = 1; воспринимается компилятором C как корректная?

Я пользуюсь MS Visual Studio 2012, и вот этот код:

			int main(void) {
    auto a = 1;
    return 0;
}
		

компилируется без ошибок, несмотря на то, что я использую расширение *.c исходника. Т.е. таким образом, я создаю код на чистом C, а насколько мне известно использование auto без указания типа стало возможным только в C++11 – заметьте, в C++, а не C.

Означает ли это, что у меня не так настроен компилятор, или этот код действительно корректен в C?

Ответ

auto – это старое ключевое слово C, обозначающее “локальную область видимости”. auto a эквивалентно auto int a, а в силу того, что в данном примере область видимости ограничена блоком, в котором объявлена переменная, то это то же самое, что и просто int a.

Это ключевое слово перешло в C еще из его предка, B, в котором не существовало базовых типов, а все было int(*): сами int‘ы, указатели на них, массивы int‘ов и т.п. И объявлялось все с помощью auto и extern. Подход “все, что тут есть – это int” в C было решено оставить, поэтому int‘овые переменные можно объявить и так:

			auto a; 
extern b; 
static c;
		

В стандарте ISO C от подобного подхода отказались, однако многие компиляторы все еще поддерживают bacward-совместимость. Если это кажется вам странным, то вспомните о том, что вот такая строка будет корректной:

			unsigned d; // на самом деле unsigend int
		

В C++ это слово вернули, но уже с новым смыслом (теперь эта конструкция позволяет явно не указывать тип переменной), ведь вряд ли множество программистов использовало это слово с оригинальным значением, особенно если учесть, что от “всего, что ты видишь – это int” отказались уже в C++98. Единственным исключением осталось тогда auto T a, чем все равно никто не пользуется.

Если вам не лень и очень интересно, можете покопаться в истории языка за авторством Страуструпа.

Кстати, интересно было организовано хранение строк в B. Строка была массивом int‘ов, каждый элемент которого хранил несколько символов. Таким образом, B – это тот же BCPL с другим синтаксисом.

Источник (StackOverflow)

Следите за новыми постами
Следите за новыми постами по любимым темам
10К открытий10К показов