MISRA C++:2008 Rule 16-0-5

Аргументы к подобному функции макросу не должны содержать лексемы, которые похожи на предварительную обработку директив

Описание

Управляйте определением

Аргументы к подобному функции макросу не должны содержать лексемы, которые похожи на предварительную обработку директив.

Объяснение

Когда компилятор сталкивается с подобными функции макросами, он заменяет аргумент макроса в заменяющий код. Если аргумент содержит лексему, которая похожа на предварительную обработку директив, заменяющий процесс во время макрорасширения не определен. В зависимости от среды такая подобная функции макро-сила ведет себя неожиданными способами, ведя к ошибкам и ошибкам.

Реализация Polyspace

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 отмечает аргументы, которые запускаются с символьного #.

Проверяйте информацию

Группа: предварительная обработка директив
Категория: необходимый
Введенный в R2013b