В определении подобного функции макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если это не будет использоваться в качестве операнда # или ##
В определении подобного функции макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если это не будет использоваться в качестве операнда # или ##.
Когда вы вызываете подобные функции макросы, компилятор расширяет макрос, заменяя его параметры на лексемы. Затем компилятор заменяет расширенным макросом в код. Этот процесс расширения и замены не более приоритетен по операции во внимание. Подобные функции макросы могут привести к неожиданным результатам, если их параметры не заключены в круглую скобку. Например, рассмотрите этот подобный функции макрос:
#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 не отмечает незаключенные в скобки параметры, если им предшествуют операторы ., ->, или символы #, ##.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
| Группа: предварительная обработка директив |
| Категория: необходимый |