Используются стандартные макросы библиотеки, например: assert и errno как объекты
Этот дефект возникает при использовании определенных идентификаторов способом, требующим наличия базового объекта. Эти идентификаторы определяются как макросы. Стандарт C не позволяет переопределять их как объекты. Идентификаторы используются таким образом, что макро-расширение идентификаторов невозможно.
Например, имеется ссылка на внешнюю переменную. errno:
extern int errno;
errno встречается не как переменная, а как макрос.Дефект относится к следующим макросам: assert, errno, math_errhandling, setjmp, va_arg, va_copy, va_end, и va_start. Средство проверки ищет дефект только в исходных файлах (а не в заголовках).
Стандарт C11 (раздел 7.1.4) позволяет переопределить большинство макросов в качестве объектов. Чтобы получить доступ к объекту, а не к макросу в исходном файле, выполните одно из следующих действий.
Повторно обозначить идентификатор как внешнюю переменную или функцию.
Для функциональных макросов заключите имя идентификатора в скобки.
При попытке использовать эти стратегии для макросов, которые не могут быть переопределены как объекты, возникает ошибка.
Не используйте идентификаторы таким образом, чтобы макро-расширение было подавлено.
Не следует повторно объявлять идентификаторы как внешние переменные или функции.
Для функциональных макросов не следует заключать имя макроса в круглые скобки.
| Группа: Программирование |
| Язык: C | C++ |
| По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода |
Синтаксис командной строки:
MACRO_USED_AS_OBJECT |
| Воздействие: Низкий |