Оператор «__has_include»

Одна штука мне очень не нравилась в программировании под «Флиппер». Фреймворк устроен так, что картинки, используемые в приложениях, должны внедряться определённым способом.

А именно — в манифесте приложения, в директиве fap_icon_assets мы указываем папку, каждая картинка в которой, позже, на этапе сборки, будет преобразована в специальный массив. Этот массив всегда называется I_имя_файла_картинки. Массивы засовываются в файл со специальным именем, который надо импортировать в код через #include.

Поскольку это происходит во время сборки, редактор (я использую «Визуал Студио Код») этот файл не видит, поэтому подчёркивает мне его импорт и все использования массивов, которые в нём описаны, как ошибку.

Лично меня такое раздражает. В редакторе мне хочется видеть полное отсутствие ошибок.

Код на C для приложения на WatchMaker: вычисление координат и отрисовка иконки &I_logo_38x54 и текста "Today's passwords:" на холсте.
Пример того как отображаются упомянутые ошибки в приложении «Пароль для Войи»

В «Виселице» я с этим смирился, а сегодня каким-то чудом вспомнил про нестандартную директиву __has_include, которую как-то не доводилось использовать прежде. Она проверяет как раз то, что мне нужно — доступен файл для импорта или нет.

Условная компиляция: если определён макрос __has_include и заголовок "voyah_pass_icons.h" доступен, он подключается; иначе объявляется внешняя константа Icon I_logo_38x54.
Реальный пример того как можно сделать, чтобы редактор не считал, что у меня ошибка

Получается, что если файл для импорта ещё не готов, то мы его не импортируем, а нужный нам массив объявляем, как имеющий внешнюю реализацию. В итоге, в редакторе ошибок не остаётся.

Комментарии 2

Сергей Чебан № 1
Вроде, __has_include вошёл в C++17, т.е. вполне стандартен.
https://en.cppreference.com/w/cpp/preprocessor/include
Евгений Степанищев автор № 2
Но я пишу на Си ) Он как будто в Си23 входит, но я не уверен — ещё не изучал стандарт внимательно.