Это касается правила Мишра 16-0-2 от MISRA C++ 2008 директивыМишр предупреждения для включают охранник
Macros shall only be #define'd or #undef'd in the global namespace.
Я понимаю, это правило, но мой polyspace Мишр проверки инструмента жалуется, что после включить охранник заявил в начале файл как несовместимый. Я предполагаю, что это может произойти, если этот файл включен в другое пространство имен, но это не относится к моему заголовочному файлу.
Какие еще ошибки в коде могут вызвать эту проблему?
#ifndef FOO_H
#define FOO_H
... code etc ...
#endif
Примечание: Пример цитируется в руководящем Мишре является
#ifndef MY_HDR
#define MY_HDR // Compliant
namespace NS
{
#define FOO // Non- Compliant
#undef FOO // Non-Compliant
}
#endif
Это одно ... странное правило, это не так, если пространства имен в любом случае влияют на препроцессор, но это заставляет его звучать так, как будто это так. – unwind
@unwind Я верю, что это целая точка правила. Чтобы разработчики не знали об отсутствии взаимодействия пространства имен и макросов, нельзя предположить, что макрос находится в пространстве имен. – Angew
Не общее решение, но обходной путь для этой проблемы, если это разрешено: используйте ['#pragma once'] (https://en.wikipedia.org/wiki/Pragma_once) вместо включения охранников. – stefaanv