﻿# V3555\. AUTOSAR\. The 'static' storage class specifier should be used in all declarations of functions that have internal linkage\.

Данное диагностическое правило основано на руководстве [AUTOSAR](https://www.autosar.org/) \(AUTomotive Open System ARchitecture\) по разработке программного обеспечения\.

Функция, объявленная однажды с 'internal linkage', при повторном объявлении или определении будет также иметь 'internal linkage'\. Это может быть неочевидно для разработчика, и поэтому следует явно указывать спецификатор 'static' в каждом объявлении и определении\.

Следующий код не соответствует правилу, так как определение не отражает тип связывания, заданный в объявлении функции 'foo'\.

```cpp
static void foo(int x);
void foo(int x)
{
  ....
}
```

Код в соответствии с правилом должен быть следующим:

```cpp
static void foo(int x);
static void foo(int x)
{
  ....
}
```

В примере, приведенном ниже, определение функции 'foo' со спецификатором класса хранения 'extern' не задает 'external linkage', как могло показаться\. Тип связывания остается 'internal linkage':

```cpp
static void foo(int x);
extern void foo(int x)
{
  ....
}
```

Правильный вариант:

```cpp
extern void foo(int x);
extern void foo(int x)
{
  ....
}
```