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

Макросы должны только быть #define 'd или #undef 'd в глобальном пространстве имен

Описание

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

Макросы должны только быть #define 'd или #undef 'd в глобальном пространстве имен.

Объяснение

Если вы зададите или не зададите макросы в локальном пространстве имен, вы можете ожидать, что макрос будет допустим только в локальном пространстве имен. Но макросы не следуют за механизмом определения объема. Вместо этого компилятор заменяет все случаи макроса его заданным значением, начинающимся в #define оператор до конца файла или до макроса переопределен. Это поведение макросов может противоречить ожиданию разработчика и может вызвать логические ошибки тот результат в ошибках.

Реализация Polyspace

Polyspace® отмечает #define или #undef оператор, который помещается в блоке вместо в глобальном пространстве имен.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

развернуть все

#include<cstdlib>
#define HCUT 1
namespace unnormalized{
	#define HCUT 6582 //Noncompliant
	void foo(){
		//...
	}
};
void bar(){
	int intEnergy = HCUT*10; 
	//HCUT is 6582, you might expect HCUT=1;
}

namespace uniteV{
	const double hcut = 6582; //eV
	void foo(){
		
	}
};

В этом примере, различных значениях HCUT заданы, возможно, чтобы вместить код, записанный при помощи различных систем модуля. Вы можете ожидать определение HCUT в пространстве имен unnormalized оставаться ограниченным пространством имен. Но значение HCUT остается 6582 до конца файла. Например, в функциональном bar, вы можете ожидать тот HCUT один, но значение HCUT остается 6582, который может вызвать логическую ошибку, неожиданные результаты и ошибки. Polyspace отмечает #define оператор в локальном пространстве имен.

Чтобы реализовать константы, которые могут иметь различные значения в различных осциллографах, используйте const переменные, как показано в пространстве имен uniteV. Избегайте использования макросов, чтобы представлять константы, которые могут потребовать различных значений в различных осциллографах.

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

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