2012-04-11 12 views
5

Czy są jakieś makra czasu kompilacji C++, które istnieją, aby wykryć, na którym systemie Windows jest kompilowany kod. Zasadniczo chcę obsługiwać niektóre funkcje tylko na Win7. Więc jestem zainteresowany zrobienie czegoś takiegoC++ makra czasu kompilacji do wykrycia systemu Windows

#if <os_macro> = WIN7 
    // This function would do something valid only on Win7 builds. 
    bool myfunction { 
     // do something here 
    } 
#else 
    // This function would typically return false, since its not supported on OS below win7 
    bool myfunction { 
     return false; 
    } 
#endif 

Czy istnieje inny lepszy sposób to zrobić?

+4

Jak której OS to opracowano na pomocna? Czy nie musi wiedzieć, który system operacyjny działa? –

+0

W Visual Studio można używać '#ifdef WIN32' lub' #ifdef _WINDOWS' dla wielu platform. Jeśli potrzebujesz tylko wersji Windows, zwykle definiujesz 'WINVER'. Dla systemu Windows 7 '#define WINVER 0x0601' – AJG85

Odpowiedz

10

OS że coraz skompilowany nie jest wszystko, co ważne; ważniejszy jest system operacyjny, w którym kod jest uruchomiony na, który oczywiście nie może wykryć podczas kompilacji. Ale jeśli chcesz, aby twój kod działał na starszych wersjach systemu Windows, możesz ustawić WINVER and _WIN32_WINNT na pewne wartości, co spowoduje, że nowsze funkcje nie będą dostępne itd. (Wystarczy przeszukać pliki nagłówkowe systemu Windows, gdzie te makra są testowane, aby uzyskać pomysł).

Aby przetestować funkcjonalność w środowisku wykonawczym, należy użyć GetProcAddress (i być może również LoadLibrary, jeśli jest w nowszej bibliotece DLL), aby sprawdzić, czy ta funkcja jest dostępna. Jeśli tak, zadzwoń, jeśli nie, nie rób tego.

Patrz także predefined macros wykorzystywane przez kompilator Visual Studio, jeśli chcesz, aby wykryć wersję kompilatora itp

+0

Zasadniczo powinienem móc powiedzieć, że jest to kompilacja Win7, która ma pewne możliwości, a jest to kompilacja WinXP, która tego nie robi. Tutaj chciałbym zdefiniować, jaka powinna być zdolność. – Rajiv

+3

Dlaczego chcesz osobne kompilacje?Dlaczego nie ma jednej wersji, która zachowuje się inaczej w zależności od systemu operacyjnego, na którym działa? –

+0

Dzięki. Zrozumiałem, co robiłem źle. – Rajiv

0

Przynajmniej z MS VC++, WIN32, _WIN32 i _WIN32_WINNT, na początek. Jeśli nie potrzebujesz kontrolować go podczas kompilacji, możesz rozważyć użycie czegoś takiego jak GetVersionEx do wykrycia w czasie wykonywania, więc ta sama kompilacja działa na starszych wersjach, ale korzysta z nowych funkcji, gdy są one dostępne.

1

Istnieje zestaw standardowych windows header macros powiedzieć dokładnie wersję systemu operacyjnego

+0

Jak mogę zrobić te makra do porównań? Próbowałem z Winver w ten sposób #if WINVER> = _WIN32_WINNT_WIN7, ale nie działało to zbyt dobrze. – Rajiv

0

moich dwóch centów dla osób, które chcą się skompilować/include różnie między konsolą a WIN32 App pod Visual Studio (2017) w moim przypadku.

można użyć kreatora do tworzenia aplikacji konsoli, będzie mieć:

Win32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

poniżej: enter image description here

Jeśli użyć kreatora do win32 GUI: pp:

WIN32; _DEBUG; _WINDOWS;% (PreprocessorDefinitions) , więc NIE _CONSOLE.

enter image description here

więc można napisać:

#ifdef _CONSOLE 
// for Console 
#else 
// for GUI 


#endif // _CONSOLE 



int main() 
{ 
#ifdef _CONSOLE 
    // for Console 
#else 
    // for GUI 


#endif // _CONSOLE 


    return 0; 
} 
Powiązane problemy