Находим серьёзную кросс-платформенную программу с открытыми исходниками, я выбрал Qt Creator.
Заходим в диалог "About" и видим как раз то, что нам нужно:
Находим построение этого диалога в исходном коде -
[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)
};
Удачи!