Правила MISRA C ®: 2012 8.1-8.14 обеспечивают эффективное кодирование деклараций и определений. При выполнении этих действий вероятность конфликтующих объявлений или непреднамеренного изменения переменных снижается.
Если вы не будете следовать этим практикам во время кодирования, ваш код может потребовать серьезных изменений позже, чтобы быть совместимым с MISRA C. У вас может быть слишком много нарушений MISRA C. Иногда, фиксируя нарушение, можно нарушить другое правило. Вместо этого следует учитывать эти правила при кодировании. Используйте MISRA C:2012 checker, чтобы обнаружить любые проблемы, которые вы могли пропустить.
Явно укажите все типы данных в объявлениях.
Избегайте неявных типов данных, таких как данное объявление 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- квалифицированный тип, если не требуется использовать указатель для изменения объекта.
Указать на const- квалифицированный тип по умолчанию, если только не предполагается использовать указатель для изменения указанного объекта. Например, в этом примере ptr не используется для изменения указанного объекта:
char last_char(const char * const ptr){
}Таким образом, вы не нарушаете MISRA C:2012 Rule 8.13.