﻿# V2601\. MISRA\. Functions should be declared in prototype form with named parameters\.

Данное диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для C\. Использование объявлений функций в стиле "K&R", а также неименованных параметров функций небезопасно\.

Функции, объявленные в старом стиле – "K&R" – не несут в себе информации о типах и количестве параметров, поэтому использование таких функций может привести к ошибкам\.

Использование именованных параметров функций дает полезную информацию об интерфейсе функции, а также позволяет отследить ошибку, если имена в объявлении и определении различаются\.

Рассмотрим пример:

```cpp
// header
void draw();

// .c file
void draw(x, y)
  double x;
  double y;
{
  // ....
}

// usage
void foo()
{
  draw(1, 2);
}
```

Декларация функции 'draw' не содержит параметров, так что при вызове функции 'draw' в нее будут переданы 2 параметра типа 'int', а не 'double', что является ошибкой\. Объявление функции с использованием прототипа исправит проблему:

```cpp
// header
void draw(double x, double y);

// .c file
void draw(double x, double y)
{
  // ....
}
```

Если функция не имеет параметров, то объявление с использованием пустых скобок не является правильным, т\.к\. такое объявление соответствует стилю "K&R":

```cpp
void foo();
```

Такая декларация допускает передачу любого числа аргументов\. Чтобы явно указать, что функция не имеет параметров, нужно использовать ключевое слово 'void':

```cpp
void foo(void);
```

Неименованные параметры делают интерфейс функции менее понятным:

```cpp
void draw(double, double);
```

Поэтому следует давать параметрам имена, чтобы избежать ошибок в использовании функции:

```cpp
void draw(double x, double y);
```