﻿# V1107\. Function was declared as accepting unspecified number of parameters\. Consider explicitly specifying the function parameters list\.

Анализатор обнаружил декларацию функции с неуточнённым количеством параметров и её вызов с ненулевым количеством аргументов\. Такой вызов может свидетельствовать об ошибке в коде\. Возможно, планировалось вызвать другую функцию с похожим именем\.

В языке С существует возможность объявить функцию с неуточнённым количеством параметров:

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

Может показаться, что такая декларация объявляет функцию, не принимающую параметров, как в C\+\+\. Однако это не так, и следующий код успешно скомпилируется:

```cpp
void foo();

void bar()
{
  foo("%d %d %d", 1, 2, 3); // No compiler checks
}
```

При декларации функции 'foo' программист мог подразумевать одно из следующих поведений\.

**Вариант N1**\. Функция 'foo' не должна была принимать параметров, и компилятор должен был выдать ошибку\. В таком случае до C23 в декларации функции следует явно указать 'void' в списке параметров:

```cpp
void foo(void);

void bar()
{
  foo("%d %d %d", 1, 2, 3); // Compile-time error
}
```

**Вариант N2**\. Функция 'foo' является вариативной и может принимать переменное количество параметров\. В таком случае следует явно во время декларации указать эллипсис \('\.\.\.'\)\.

```cpp
void foo1(const char *, ...); // since C89
void foo2(...);               // since C23

void bar()
{
  foo1("%d %d %d", 1, 2, 3); // ok since C89
  foo2("%d %d %d", 1, 2, 3); // ok since C23
}
```

**Примечание**\. Начиная с C23, компиляторы обязаны рассматривать следующие декларации как декларации функций, не принимающих параметров:

```cpp
void foo();     // Takes no parameters
void bar(void); // Takes no parameters
```

Анализатор знает об этом поведении и не выдаёт срабатывания для таких деклараций, начиная с C23\.