Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

auto в Си и Си++

Из-за дикой перегруженности фичами мне никогда не нравился язык Си++. До увлечения игрой «Гопник-2» никогда на нём не программировал, но нужда заставила. Тянет с ней повозиться, а она написана на смеси Си и Си++, правда с упором на Си.

Несмотря на неприязнь к Си++, всё-таки не могу не отметить, что местами на нём программировать куда проще, чем на Си. К сожалению, для того чтобы использовать реально полезные вещи, — нормальные строки или управление памятью, пришлось бы в игре многое переписать, но какие-то мелочи выручают и без переписывания кода.

Одна из таких мелочей — ключевое слово auto. Оно есть и в Си, но значение у него совершенно другое, в современном коде, как будто бы, его использовать негде.

В Си++ оно означает автоматический вывод типа, вместо его явного указания. Клёвая штука, позволяет делать например такое (пример из кода «Гопника-2»):

auto old_mode = set_tty_special_mode();
// тут какой-то код
restore_tty_mode(old_mode);

Фишка тут в том, что у set_tty_special_mode и restore_tty_mode две реализации — под «Виндоуз» своя. Эти две реализации работают с разными типами, под «Виндоуз» там DWORD, в остальных случаях — структура termios.

В Си было бы что-то вроде:

#ifdef __MINGW32__
#typedef DWORD terminal_mode
#else
#typedef struct termios terminal_mode
#endif

terminal_mode old_mode = set_tty_special_mode();
// тут какой-то код
restore_tty_mode(old_mode);

А в Си++ можно просто поставить auto и обойтись без шаблонного кода. Очень хочется иметь такую клёвую примочку и в Си.

2 комментария
deadem 2023

В gcc и в его производном mingw есть typeof, который работает как-то так: https://godbolt.org/z/aEcxfYYfY
Не так выразительно, как в C++, конечно, но может спасти, когда нужно

Евгений Степанищев 2023

в GCC 4.9 есть «__auto_type»: https://godbolt.org/z/r3nrKoeh8

Но это всё расширения же, не сам язык.

deadem 2023

Пока ещё нет, но в черновике C23 он уже есть: https://open-std.org/JTC1/SC22/WG14/www/docs/n3054.pdf
И auto там тоже есть. Вероятно, что в этом году примут обоих.

Евгений Степанищев 2023

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