Определите массив с помощью команды #define, не соответствующей правилам мисра

У меня есть такое определение:

static const char* STRING_ARRAY[NUM_UNITS] = STRING_ARRAY_VALUES;

когда

#define STRING_ARRAY_VALUES                 \
{   "n/a",                                  \
  "bool",                                   \
  ...                                       \
}

К сожалению, это не соответствует правилу MISRA-C++ 8-5-2:

"MISRA-C++ Rule 8-5-2 (required): Braces shall be used to indicate and match the 
structure in the non-zero initialization of arrays and structures."

Может ли кто-нибудь объяснить мне, почему это не соответствует требованиям? Я думал, что команда #define превращает определение в нечто вроде:

static const char* STRING_ARRAY[NUM_UNITS] = {"n/a", "bool",...}

который соответствует правилам MISRA.

Есть ли способ сделать это в соответствии с MISRA, сохраняя при этом #define?


person or.nomore    schedule 28.02.2013    source источник
comment
Где эта декларация?   -  person chris    schedule 28.02.2013
comment
массив находится в файле .cpp, а #define — в файле .h.   -  person or.nomore    schedule 28.02.2013
comment
У меня отлично работает, если я убираю многоточие, объявляю NUM_UNITS и помещаю все это в файл cpp.   -  person chris    schedule 28.02.2013
comment
что ты имеешь ввиду под нормально работает? это работает, но выдает предупреждение MISRA. И это большой проект, и я не могу переместить #define в файл .cpp.   -  person or.nomore    schedule 28.02.2013
comment
Я имею в виду, что единственное предупреждение, которое я получаю, это неиспользуемая переменная в Clang и GCC, и никаких предупреждений в Intel. Если вы попробуете это в новом проекте и не получите предупреждения, держу пари, нам нужно увидеть sscce, который это делает.   -  person chris    schedule 28.02.2013
comment
@chris Вы должны запустить его через статический анализатор, совместимый с MISRA-C++. Если вы понятия не имеете, что это такое, то просто забудьте, что видели этот вопрос :)   -  person Lundin    schedule 01.03.2013
comment
@Lundin, да, после этого мне потребовалось немного времени, чтобы понять это, но даже в этом случае я не могу представить, почему это выдает такую ​​​​ошибку. Ваш ответ подтверждает это тем, что он не дает вам ошибки.   -  person chris    schedule 01.03.2013


Ответы (1)


Возможны две причины:

  • Либо у вас сломался чекер MISRA. Я проверил ваш код с помощью LDRA Testbed, и он не выдает ошибок.
  • Или я полагаю, что NUM_UNITS, возможно, не соответствует количеству указателей, переданных в массив. Мне непонятно, является ли это нарушением правила MISRA или нет. Вы можете добавить статическое утверждение, что sizeof(STRING_ARRAY)/sizeof(const char*) == NUM_UNITS, что является хорошей практикой независимо от MISRA.
person Lundin    schedule 01.03.2013
comment
Да, я думаю, ты прав. В определении отсутствовала одна запятая, поэтому я предполагаю, что вместо параметров NUM_UNITS было NUM_UNITS-1 параметров. Хотя я бы ожидал, что он потерпит неудачу на этапе компиляции из-за отсутствующей запятой. - person or.nomore; 03.03.2013
comment
@or.nomore Это не потерпит неудачу, потому что два строковых литерала, "hello" "world", написанные рядом друг с другом, как в этом примере, или с новой строкой в ​​исходном коде, будут автоматически объединены препроцессором в один элемент helloworld. Это особенность языка, поэтому программистам не нужно писать чрезмерно длинные строки в одной строке исходного кода. - person Lundin; 04.03.2013
comment
Я ожидал, что он потерпит неудачу на этапе компиляции - Нет... это допустимый, синтаксический C/C++, хотя и нелогичный - вот почему правило MISRA существует! - person Andrew; 15.01.2018