2016-11-10 9 views
2

Это касается правила Мишра 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 
+4

Это одно ... странное правило, это не так, если пространства имен в любом случае влияют на препроцессор, но это заставляет его звучать так, как будто это так. – unwind

+0

@unwind Я верю, что это целая точка правила. Чтобы разработчики не знали об отсутствии взаимодействия пространства имен и макросов, нельзя предположить, что макрос находится в пространстве имен. – Angew

+0

Не общее решение, но обходной путь для этой проблемы, если это разрешено: используйте ['#pragma once'] (https://en.wikipedia.org/wiki/Pragma_once) вместо включения охранников. – stefaanv

ответ

1

Если эти охранники заголовка помещается вне всяких скобок (в глобальном пространстве имен), то ваш код хорошо и ваш инструмент сломан. Отправьте отчет об ошибке в Polyspace.

Основой этого правила является то, что директивы предварительного процессора не должны размещаться внутри фигурных скобок (внутри деклараций или функций пространства имен и т. Д.), Поскольку их область действия всегда глобальна независимо от места размещения.