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

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

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

    // sample.h

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

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

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

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

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

    // sample.h

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

    // sample.cpp

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