Вы используете стандартные библиотечные макросы, такие как 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 |
Влияние: Низкое |