exponenta event banner

MISRA C:2012 Правило 20.6

Маркеры, похожие на директиву предварительной обработки, не должны появляться в аргументе макроса

Описание

Определение правила

Маркеры, похожие на директиву предварительной обработки, не должны появляться в аргументе макроса.

Объяснение

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

Внедрение Polyspace

Polyspace ® ищет # символ в аргументах макроса (вне строки или символьной константы).

Дополнительное сообщение в отчете

Аргумент макроса не должен выглядеть как директива предварительной обработки.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#define M( A ) printf ( #A )

#include <stdio.h>

void foo(void){
    M(
#ifdef SW         /* Non-compliant */
    "Message 1"
#else
    "Message 2"   /* Compliant - SW not defined */
#endif            /* Non-compliant */
    );
}

В этом примере показано определение макроса и его использование. #ifdef SW и #endif являются несоответствующими, поскольку они похожи на директиву предварительной обработки. Polyspace не помечен #else "Message 2" потому что после расширения макроса Polyspace знает SW не определен. Расширенный макрос: printf ("\"Message 2\"");

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

Группа: Директивы предварительной обработки
Категория: Обязательно
Категория СМЖЛ: требуется