Аргументы к подобному функции макросу не должны содержать лексемы, которые похожи на предварительную обработку директив
Аргументы к подобному функции макросу не должны содержать лексемы, которые похожи на предварительную обработку директив.
Когда компилятор сталкивается с подобными функции макросами, он заменяет аргумент макроса в заменяющий код. Если аргумент содержит лексему, которая похожа на предварительную обработку директив, заменяющий процесс во время макрорасширения не определен. В зависимости от среды такая подобная функции макро-сила ведет себя неожиданными способами, ведя к ошибкам и ошибкам.
Polyspace® флаги вызывают к подобным функции макросам, если их аргумент запускается с символьного #
.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
#include<cstdlib> #include<iostream> #define PRINT(ARG) std::cout<<#ARG //.... #define Error1 //... void foo(void){ PRINT( #ifdef Error1 //Noncompliant "Error 1" #else "Error 2" #endif //Noncompliant ); }
В этом примере, подобном функции макро-PRINT
вызывается с аргументом, который выбирает между двумя строками при помощи #ifdef
блок. В зависимости от среды выходом этого кода может быть #ifdef Error1 //Noncompliant "Error 1" #else "Error 2" #endif //Noncompliant
или Error 1
. Polyspace отмечает аргументы, которые запускаются с символьного #
.
Группа: предварительная обработка директив |
Категория: необходимый |