﻿# V2625\. MISRA\. Identifiers that define objects or functions with external linkage shall be unique\.

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

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

**Примечание\.** Для поиска неуникальных идентификаторов в разных юнитах трансляции требуется включить режим межмодульного анализа\.

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

```cpp
int var;  // external linkage

void foo()
{
  short var;  // no linkage
}
```

В данном коде идентификатор 'var' с внешним типом связывания будет скрыт локальной переменной в функции 'foo'\. Корректный код будет выглядеть так:

```cpp
int var;  // external linkage

void foo()
{
  short temp;  // no linkage
}
```

Рассмотрим ещё один пример, но на основе содержимого двух файлов одного проекта:

```cpp
// file1.c
int x;             // external linkage
static int y;      // internal linkage

static void bar(); // internal linkage

// file2.c
void bar()  // external linkage       
{
  int y;    // no linkage
}    

void foo()  // external linkage 
{                  
  int x;    // no linkage 
}
```

Идентификаторы 'x' из 'file1\.c' и 'bar' из 'file2\.c' имеют внешний тип связывания и не являются уникальными, поэтому нарушают данное правило\. Идентификатор 'y' не является уникальным, но поскольку в 'file1\.c' он имеет внутреннее связывание, а в 'file2\.c' не имеет связывания, то данное правило не нарушается для этого имени\.

Корректный код:

```cpp
// file1.c
static int x;        // internal linkage
static int y;        // internal linkage

static void func();  // internal linkage

// file2.c
void bar()  // external linkage         
{
  int y;    // no linkage
}    

void foo()  // external linkage 
{                  
  int x;    // no linkage 
}
```