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