вторник, августа 06, 2013

Лучшая фича C++ в C

Лучшая фича C++ - деструктор. Точно не помню кто это сказал, по-моему Страуструп. Если задуматься это действительно так - если убрать деструкторы, то смысл использовать C++ пропадает, так как практически всё в C++ что отличает его от C построено на деструкторах (ну и на исключениях наверное, хотя некоторые лишены возможности их использовать в приказном порядке).

Например в нижеприведенном коде главное не лямбда с кастомным deleter'ом, можно ведь сделать отдельный класс для счетчика и в деструкторе сделать то же самое что в лямбде (ну кроме delete) - лямбда, unique_ptr с deleter'ом всё это не критично для идеи(хотя конечно их наличие создаёт удобства), а вот если будет отсутствовать деструктор, то придется писать в C-стиле и возникнет вопрос "а зачем нам вообще C++".

Disclaimer: не ищите в коде особый смысл, просто можете рассматривать как заготовку для локального дебаг логгинга - не важно где и как(через return или через исключение) мы выйдем из функции, но в лог запишется состояние счетчика на момент выхода(понятно что в реальности можно писать дамп объекта например, а не счетчика):
Так вот оказывается в C в gcc есть нестандартное расширение для эмуляции деструктора. Расширение выполнено в виде атрибута cleanup. Ниже листинг кода на C аналогичный C++ выше, ну правда я слегка всё упростил и исключений нет (я не стал их эмулировать через setjmp()/longjmp(), так как пост не об этом) - но идея та же.
Не очень красиво, но красота в C наводится с помощью макросов, поэтому это исправимо. Так что к термину "C++ без исключений" можно добавить "C(си) с деструкторами".

Кстати что меня удивляет это то что в C++ нет designated initializer, хотя в C он есть с прошлого века. При работе с C-библиотеками иногда очень не хватает... Наверное есть весомые причины почему его нет в C++, но лезть копаться в стандартах и парсерах чтобы понять конкретную проблему я пока не готов. :)