MISRA C®Правила 8.1-8.14 2012 года обеспечивают соблюдение надлежащей практики кодирования, связанной с декларациями и определениями. Если вы следуете этим практикам, у вас меньше шансов иметь конфликтующие объявления или непреднамеренно изменить переменные.
Если вы не соблюдаете эти методы во время кодирования, ваш код может потребовать серьезных изменений позже, чтобы соответствовать MISRA C. У вас может быть слишком много нарушений MISRA C. Иногда, исправляя нарушение, вы можете нарушить другое правило. Вместо этого имейте эти правила в виду при кодировании. Используйте проверку C:2012 MISRA, чтобы определить любые проблемы, которые вы могли пропустить.
Явным образом задайте все типы данных в объявлениях.
Избегайте неявных типов данных, таких как это объявление k
:
extern void foo (char c, const k);
Вместо этого используйте:
extern void foo (char c, const int k);
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.1
.
При объявлении функций задайте имена и типы данных для всех параметров.
Избегайте объявлений без таких имен параметров, как эти объявления:
extern int func(int); extern int func2();
Вместо этого используйте:
extern int func(int arg); extern int func2(void);
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.2
.
Если вы хотите использовать объект или функцию в нескольких файлах, объявите объект или функцию один раз только в одном заголовочном файле.
Чтобы использовать объект в нескольких исходных файлах, объявите его как extern
в заголовочном файле. Включите заголовочный файл во все исходные файлы, где вам нужен объект. В одном из этих исходных файлов задайте объект. Для образца:
/* header.h */ extern int var;
/* file1.c */ #include "header.h" /* Some usage of var */
/* file2.c */ #include "header.h" int var=1;
Чтобы использовать функцию в нескольких исходных файлах, объявите ее в заголовочном файле. Включите заголовочный файл во все исходные файлы, где вам нужна функция. В одном из этих исходных файлов задайте функцию.
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.3
, MISRA C:2012 Rule 8.4
, MISRA C:2012 Rule 8.5
, или MISRA C:2012 Rule 8.6
.
Если вы хотите использовать объект или функцию только в одном файле, объявите и задайте объект или функцию с static
спецификатор.
Убедитесь, что вы используете static
спецификатор во всех объявлениях и определении. Например, эта функция func
предназначено для использования только в текущем файле:
static int func(void); static int func(void){ }
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.7
и MISRA C:2012 Rule 8.8
.
Если вы хотите использовать объект только в одной функции, объявите объект в теле функции.
Избегайте объявления объекта вне функции.
Например, если вы используете var
в func
только, объявите его вне тела func
:
int var; void func(void) { var=1; }
Вместо этого используйте:
void func(void) { int var; var=1; }
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.7
и MISRA C:2012 Rule 8.9
.
Если вы хотите ввести функцию в строку, объявите и задайте функцию с static
спецификатор.
Каждый раз, когда вы добавляете inline
к определению функции добавьте static
также:
static inline double func(int val); static inline double func(int val) { }
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.10
.
При объявлении массивов явным образом задайте их размер.
Избегайте неявных спецификаций размера, таких как это:
extern int32_t array[];
Вместо этого используйте:
#define MAXSIZE 10 extern int32_t array[MAXSIZE];
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.11
.
При объявлении перечислений старайтесь избегать смешивания неявных и явных спецификаций.
Избегайте смешивания неявных и явных спецификаций. Можно явным образом задать первую константу перечисления, но после этого использовать неявные или явные спецификации. Например, избегайте этого типа смеси:
enum color {red = 2, blue, green = 3, yellow};
Вместо этого используйте:
enum color {red = 2, blue, green, yellow};
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.12
.
При объявлении указателей указывайте на const
-qualified type, если вы не хотите использовать указатель для изменения объекта.
Указание на const
-qualified type по умолчанию, если только вы не хотите использовать указатель для изменения остроконечного объекта. Например, в этом примере ptr
не используется для изменения заостренного объекта:
char last_char(const char * const ptr){ }
Таким образом, вы не нарушаете MISRA C:2012 Rule 8.13
.