Пользовательские директивы #pragma

Пользовательские директивы #pragma
Пользовательские директивы #pragma - willbreen @ Unsplash

Я создаю анализатор языка на микропроцессоре на C++. Для таблиц ключевых слов и команд, вместо того, чтобы поддерживать один кураторский файл (отсортированный по алфавиту и т. д.), я бы предпочел объявить их в файлах заголовков для каждого набора функций (т. е. несортированных). Затем я могу заставить make-файл запустить программу для сканирования файлов заголовков и создания курируемого главного заголовочного файла перечислений и того, что компилятор может пережевывать. Таким образом, мне нужно скрыть свои объявления токенов/команд во время обычной предварительной обработки. Я мог бы пойти по пути doxygen и просто скрыть их в комментариях специальным тегом. Мне интересно, какая широта есть для создания моих собственных директив прагмы для моей задачи.

Безопасно ли и переносимо просто объявить мою собственную прагму (например, #pragma decl_token "goleft")? Пока препроцессор не распознает его, кажется, что он игнорируется. Я также пытался использовать оператор #assert, который, как мне казалось, может быть вполне законным, но кажется проблематичным из-за того, что он нестандартен. Я признаю, что сам немного нестандартен, но я стараюсь не быть слишком мошенником.

#pragma директивы полностью зависят от реализации. Это означает языковую реализацию, которую вы создаете. Вы можете делать с ними все, что захотите. Буквально что угодно.

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

Когда другие реализации, такие как GCC, считывают ваш код, они обычно выдают предупреждения о неизвестных прагмах, а не об ошибках, поэтому наличие ваших собственных прагм не мешает кому-то скомпилировать ваш код другим компилятором.


LetsCodeIt, 17 февраля 2023 г., 19:18