2012-04-11 11 views
5

¿Hay alguna macro de tiempo de compilación en C++ que exista para detectar en qué sistema operativo Windows se está compilando el código? Básicamente quiero apoyar ciertas funciones solo en Win7. Entonces estoy interesado en hacer algo como estoC++ macros de tiempo de compilación para detectar ventanas os

#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 

¿Hay alguna otra manera mejor de hacer esto?

+4

¿Cómo se qué sistema operativo es compilado en el útil? ¿No necesita saber en qué sistema operativo se está ejecutando? –

+0

En Visual Studio puede usar '#ifdef WIN32' o' #ifdef _WINDOWS' para multiplataforma. Si solo quieres la versión de Windows, normalmente defines 'WINVER'. Para Windows 7 '#define WINVER 0x0601' – AJG85

Respuesta

10

El sistema operativo que se está haciendo compilado no es tan importante; lo que más importa es el sistema operativo que el código es ejecutando, que obviamente no puede detectar en tiempo de compilación. Pero si desea que su código se ejecute en versiones anteriores de Windows, puede establecer WINVER and _WIN32_WINNT en ciertos valores, lo que hará que las funciones más nuevas no estén disponibles, etc. (solo busque en los archivos de encabezado de Windows dónde se prueban esas macros para obtener una idea)

Para probar la funcionalidad en tiempo de ejecución, use GetProcAddress (y posiblemente también LoadLibrary, si está en una DLL más reciente) para comprobar si la función está disponible. Si es así, llámalo, si no, no lo llames.

Véase también el predefined macros utilizado por el compilador de Visual Studio si desea detectar la versión del compilador, etc.

+0

Básicamente debería poder decir que es una versión de Win7 que tiene cierta capacidad, y esta es una versión de WinXP que no lo tiene. Aquí estaría definiendo cuál debería ser la capacidad. – Rajiv

+3

¿Por qué quieres compilaciones separadas?¿Por qué no tener una compilación que se comporta de manera diferente según el sistema operativo en el que se ejecuta? –

+0

Gracias. Entendí lo que estaba haciendo mal. – Rajiv

0

Al menos con MS VC++, WIN32, _WIN32 y _WIN32_WINNT, para empezar. A menos que necesite controlarlo en tiempo de compilación, puede considerar usar algo como GetVersionEx para detectar en tiempo de ejecución, por lo que la misma versión se ejecuta en versiones anteriores, pero aprovecha las nuevas características cuando están disponibles.

1

Hay un conjunto de windows header macros estándar para informarle la versión exacta del sistema operativo

+0

¿Cómo hago esas comparaciones para hacer las comparaciones? Intenté con Winver así #if WINVER> = _WIN32_WINNT_WIN7, pero no funcionó muy bien. – Rajiv

0

mi granito de arena para las personas que desean compilar/incluir de forma diferente entre la consola y la aplicación WIN32 bajo Visual Studio (2017) en mi caso.

Se utiliza asistente para crear una aplicación de consola, tendrá:

WIN32; _DEBUG; _CONSOLE;% (PreprocessorDefinitions)

bajo: enter image description here

Si utiliza el Asistente para Win32 GUI A pp:

WIN32; _DEBUG; _WINDOWS;% (PreprocessorDefinitions) así que NO _CONSOLE.

enter image description here

para que pueda escribir:

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


#endif // _CONSOLE 



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


#endif // _CONSOLE 


    return 0; 
} 
Cuestiones relacionadas