вы всегда можете просто кешировать результат:
bool GetOS(LPTSTR pszOS)
{
static bool has_cached = false;
static bool result = false;
static TCHAR buf[80];
if(!has_cached)
{
has_cached = true;
OSVERSIONINFOEX osve;
BOOL bOsVersionInfoEx;
ZeroMemory(&osve, sizeof(OSVERSIONINFOEX));
osve.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osve)) )
{
result = false;
}
else
{
StringCchPrintf( buf, 80, TEXT("%u.%u.%u.%u"),
osve.dwPlatformId,
osve.dwMajorVersion,
osve.dwMinorVersion,
osve.dwBuildNumber);
result = true;
}
}
if(result)
StringCchCat(pszOS, BUFSIZE, buf);
return result;
}
Таким образом, вы вычисляете все только один раз, но сохраняете свою логику и инициализацию в одном месте. Статическая область действия кэширующих переменных также гарантирует, что только эта процедура может получить доступ к переменным, поэтому она немного безопаснее обычной глобальной переменной. Я кеширую только логический результат, если вам нужно кэшировать больше информации, просто добавьте больше статических переменных.