﻿# V2618\. MISRA\. Identifiers declared in the same scope and name space should be distinct\.

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

Это правило актуально только для С\. Объявление двух идентификаторов в одной области видимости, различающихся только незначимыми символами, приводит к неопределённому поведению\. Помимо этого, длинные идентификаторы затрудняют чтение кода, а также могут быть перепутаны с автоматически сгенерированными\.

До стандарта С99 значимыми являются только первые 31 символ\. Начиная со стандарта С99 – первые 63 символа\. Остальные символы считаются незначимыми\.

Данное правило не применяется, если оба идентификатора имеют [external linkage](https://pvs-studio.ru/ru/blog/terms/6506/), так как для этого случая предназначена диагностика [V2614](https://pvs-studio.ru/ru/docs/warnings/v2614/)\.

Данное правило не применяется, если один из идентификаторов \- макрос\.

Рассмотрим пример для С90:

```cpp
//         1234567890123456789012345678901***
static int very_long_long_long_long__test_var1;  // (1)
extern int very_long_long_long_long__test_var2;  // (2)
```

Идентификаторы 1 и 2 различаются только незначимыми символами 'var1' и 'var2', в то время как значимая часть 'long\_long\_long\_long\_long\_\_test\_' совпадает\. Для того, чтобы избежать неопределенного поведения, необходимо сократить длину идентификатора:

```cpp
//         1234567890123456789012345678901***
static int not_very_long__test_var1;
extern int not_very_long__test_var2;
```

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

```cpp
//         1234567890123456789012345678901***
static int long_long_long_long_long__test_var3;  // (3)

void foo()
{
//    1234567890123456789012345678901***
  int long_long_long_long_long__test_var4;       // (4)
}
```

Здесь идентификаторы 3 и 4 также различаются только незначимыми символами, однако они находятся в разных областях видимости, поэтому нарушения правила здесь нет\.