В определении подобного функции макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если это не будет использоваться в качестве операнда # или ##
В определении подобного функции макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если это не будет использоваться в качестве операнда # или ##.
Когда вы вызываете подобные функции макросы, компилятор расширяет макрос, заменяя его параметры на лексемы. Затем компилятор заменяет расширенным макросом в код. Этот процесс расширения и замены не более приоритетен по операции во внимание. Подобные функции макросы могут привести к неожиданным результатам, если их параметры не заключены в круглую скобку. Например, рассмотрите этот подобный функции макрос:
#define dustance_from_ten(x) x>10? x-10:10-x
a-b>10: a-b-10:10-a-b
10-a-b
эквивалентно 10-(a+b)
вместо намеченного расстояния 10-(a-b)
. Это неожиданное поведение может привести к ошибкам и ошибкам. Чтобы избежать таких неожиданных поведений, заключите параметры подобного функции макроса в круглых скобках.Исключение к этому правилу - когда параметр используется в качестве операнда #
или ##
.
Polyspace® отмечает подобные функции макроопределения, если параметры не заключены в круглую скобку. Polyspace не отмечает незаключенные в скобки параметры, если им предшествуют операторы .
, ->
, или символы #
, ##
.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
Группа: предварительная обработка директив |
Категория: необходимый |