Экземпляр static создается множество раз...
От: _agg  
Дата: 18.07.19 04:30
Оценка:
привет всем, впервые столкнулся с такой "магией" переменной со спецификатором static, можно конечно сделать по другому, но мне хочется понять почему так происходит. Есть DLL в которой множество файлов исходников, есть файлик transfer.h :
#pragma once
#include "Utils.h"
#include <algorithm>
#include <vector>
...
class InfoData
{
public:
    ...
    static InfoData *FromRawData(BYTE * rawData, const DWORD &length);
    ...
}

static Utils::VERSION currentClientVersion;


есть файлик transfer.cpp:
#include <stdafx.h>
...
const Utils::VERSION checkingClientVersion(19, 6, 3, 0);
...
InfoData *InfoData::FromRawData(BYTE * rawData, const DWORD &length) {
    ...
    if(currentClientVersion >= checkingClientVersion){
    ...
    }else{
    ...
    }    
}


сам файлик с классом VERSION Utils.h:
namespace Utils {
...
        struct VERSION {
        uint32_t versionBytes[4] = { 0,0,0,0 };
        CString versionString;
        VERSION() {}
        VERSION(uint32_t major, uint32_t minor, uint32_t build, uint32_t revision) : versionBytes{ major , minor , build ,revision } {
            versionString.Format(_T("%lu,%lu,%lu,%lu"), major, minor, build, revision);
        }
        ~VERSION() {}
        bool operator >=(const VERSION &version)const {
            return versionBytes[0] >= version.versionBytes[0]
                && versionBytes[1] >= version.versionBytes[1]
                && versionBytes[2] >= version.versionBytes[2];
        }        
        void StringToVersion(const CString &str) { //version expected format: 18,13,124,999-9F8E205
            versionString = str;
            CString Seperator = _T(".,");
            int Position{ 0 }, versPos{ 0 };
            CString Token = versionString.Tokenize(Seperator, Position);
            versionBytes[versPos++] = _tstoi(Token);
            while (!(Token = versionString.Tokenize(Seperator, Position)).IsEmpty()) {
                versionBytes[versPos++] = _tstoi(Token);
            }
        }
    };    
};


так же есть файлик в котором заполняется клиентская версия Statistic.cpp:
LIBRARY_API DWORD WINAPI GetClientVersion(LPSTR buf, ULONG bufSize) {
...
    currentClientVersion.StringToVersion(ver);
...
}


Вся суть этого сводится к сравнению клиентской версии и если она больше либо равна заданной то выполняются определенные действия. В результате получаю такую картину:
ставлю точку останова на конструктор VERSION и смотрю сколько раз создается currentClientVersion получаю адреса создания {7fedc280ff0 ,...еще 4 адреса..., 7fedc2812f8 }
затем заполнение currentClientVersion происходит по адресу 7fedc2812f8
затем сравнение currentClientVersion происходит по адресу 7fedc280ff0
деструкторы срабатывают в обратном порядке создания.

Компилятор не выводит никаких сообщений что он игнорирует этот static, собирается это все в Visual Studio 2017.
КАК ТАКОЕ ПРОИСХОДИТ ЭТО ЖЕ STATIC? КАК ОН МОЖЕТ СОЗДАВАТЬСЯ МНОЖЕСТВО РАЗ, ВРАЗУМИТЕ КТО ПОНЯЛ В ЧЕМ ДЕЛО, ЧЕГО Я НЕ ВИЖУ ЧТО ПРИВОДИТ К МНОЖЕСТВЕННОМУ СОЗДАНИЮ ОБЪЕКТА СО СПЕЦИФИКАТОРОМ STATIC?
Отредактировано 18.07.2019 5:07 _agg . Предыдущая версия . Еще …
Отредактировано 18.07.2019 5:01 _agg . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.