Ответы пользователя по тегу Портирование ПО
  • Портабельный макрос для получения строки версии C++ компилятора и времени сборки приложения?

    EXL
    @EXL
    Энтузиаст
    Находим серьёзную кросс-платформенную программу с открытыми исходниками, я выбрал Qt Creator.

    Заходим в диалог "About" и видим как раз то, что нам нужно:

    wmUZzbo.png

    Находим построение этого диалога в исходном коде - [src/plugins/coreplugin/versiondialog.cpp | 77].

    Видим, что для получения даты и времени сборки использованы тривиальные предопредёленные макросы __DATE__ и __TIME__, которые гарантировано должны быть предопределены во всех компиляторах.

    А вот для нахождения версии компилятора используется специальная функция ICore::buildCompatibilityString(). Проследуем по цепочке вызовов: [src/plugins/coreplugin/icore.cpp | 472].

    В функции ICore::buildCompatibilityString() используется вызов статической функции compilerString() для получения информации о компиляторе и QSysInfo::WordSize для получения информации о битности порождаемого компилятором кода.

    Функция compilerString() [src/plugins/coreplugin/icore.cpp | 440-458] выглядит так:

    static QString compilerString()
    {
    #if defined(Q_CC_CLANG) // must be before GNU, because clang claims to be GNU too
        QString isAppleString;
    #if defined(__apple_build_version__) // Apple clang has other version numbers
        isAppleString = QLatin1String(" (Apple)");
    #endif
        return QLatin1String("Clang " ) + QString::number(__clang_major__) + QLatin1Char('.')
                + QString::number(__clang_minor__) + isAppleString;
    #elif defined(Q_CC_GNU)
        return QLatin1String("GCC " ) + QLatin1String(__VERSION__);
    #elif defined(Q_CC_MSVC)
        if (_MSC_VER >= 1800) // 1800: MSVC 2013 (yearly release cycle)
            return QLatin1String("MSVC ") + QString::number(2008 + ((_MSC_VER / 100) - 13));
        if (_MSC_VER >= 1500) // 1500: MSVC 2008, 1600: MSVC 2010, ... (2-year release cycle)
            return QLatin1String("MSVC ") + QString::number(2008 + 2 * ((_MSC_VER / 100) - 15));
    #endif
        return QLatin1String("<unknown compiler>");
    }

    Макросы Q_CC_CLANG, Q_CC_GNU и Q_CC_MSVC можно заменить на __clang__, __GNUC__ || __MINGW32__ и _MSC_VER соответственно. Вызовы QLatin1String() можно заменить обычным std::string, QString::number() - чем-нибудь типа sprintf, itoa, std::to_string (если используете c++11).

    А QSysInfo::WordSize это простой:

    enum Sizes {
            WordSize = (sizeof(void *)<<3)
    };

    Удачи!
    Ответ написан
    1 комментарий