﻿# V1096\. Variable with static storage duration is declared inside the inline function with external linkage\. This may lead to ODR violation\.

Анализатор обнаружил ситуацию, в которой внутри 'inline' функции, определённой в заголовочном файле, объявлена статическая переменная\. Это может привести к нарушению правила ODR\.

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

```cpp
// sample.h

class MySingleton
{
public:
  static MySingleton& GetInstance()
  {
    static MySingleton Instance; // <=
    return Instance;
  }
};
```

Класс 'MySingleton' содержит функцию\-член 'GetInstance', который возвращает экземпляр статической переменной 'Instance'\. Так как функция определена там же, где и объявлена, компилятор неявно пометит её как 'inline'\. В таком случае компоновщик объединит определения функции 'GetInstance' во всех единицах трансляции\. 

Однако этого не произойдёт в случае объединения определений между модулем исполняемой программы и динамической библиотекой\. В результате при выполнении программы будет создано уже два экземпляра статической переменной 'Instance', что нарушает правило ODR\.

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

Исправленный пример:

```cpp
// sample.h

class MySingleton
{
public:
  static MySingleton& GetInstance();
};

// sample.cpp

MySingleton& MySingleton::GetInstance()
{
  static MySingleton Instance;
  return Instance;
}
```