Я специально ищу странное определение макроса: мне нужен макрос, определенный таким образом, чтобы в случае, если макрос эффективно использовался в скомпилированном коде, компилятор неизменно выдавал ошибку.
Предыстория: поскольку C11 ввел несколько новых ключевых слов, а новый стандарт C ++ 11 также добавил несколько, я хотел бы добавить файл заголовка в мои проекты (в основном с использованием компиляторов C89 / C95 с несколькими дополнениями) заставить разработчиков воздерживаться от использования этих новых ключевых слов в качестве имен идентификаторов, если, конечно, они не распознаются в качестве ключевых слов по назначению.
В древнем прошлом я делал это для new
так:
#define new *** /* C++ keyword, do not use */
И да, это сработало. Пока этого не произошло, когда программист забыл подчеркивание в имени параметра:
void myfunction(uint16_t new parameter);
С тех пор я использовал варианты, но мне никогда больше не бросали вызов.
Теперь я намереваюсь создать файл со всеми ключевыми словами, не поддерживаемыми различными компиляторами, и я ищу надежное решение, в лучшем случае с не слишком запутанным сообщением об ошибке. «Синтаксическая ошибка» была бы в порядке, но «отсутствующий параметр» уже сбивал бы с толку.
Я думаю, что это похоже на
#define atomic +*=*+ /* C11 derived keyword; do not use */
и, кроме моих обычных колебаний, я вполне уверен, что любое использование (но не определение) макроса приведет к ошибке.
РЕДАКТИРОВАТЬ: Чтобы сделать это еще сложнее, MISRA будет разрешать использовать только базовый набор символов источника и выполнения, поэтому @
или $
не допускаются.
Но я хотел бы спросить сообщество: у вас есть лучшая макроэкономическая ценность? Как эффективно, но короче? Или даже дольше, но более надежным в какой-то странной ситуации? Или совершенно другой метод генерации ошибки (только с использованием компилятора, а не внешних инструментов!), Когда для каких-либо целей используется «обескураженный» идентификатор?
Отказ от ответственности:
И да, я знаю, что могу использовать grep или парсер для запуска на ночной сборке и сообщать о найденных предупреждениях. Но удаление немедленной ошибки на столе разработчиков происходит быстрее, и ее обязательно нужно исправить до регистрации.