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