Вы используете стандартные библиотечные макросы, такие как 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++ |
| По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: MACRO_USED_AS_OBJECT |
| Влияние: Низкое |