Comstackción de C ++ en Windows y Linux: ifdef cambiar

Quiero ejecutar código c ++ en Linux y Windows. Hay algunos fragmentos de código que quiero incluir solo para un sistema operativo y no para el otro. ¿Hay un #ifdef estándar que pueda usarse una vez?

Algo como:

#ifdef LINUX_KEY_WORD ... // linux code goes here. #elif WINDOWS_KEY_WORD ... // windows code goes here. #else #error "OS not supported!" #endif 

La pregunta es de hecho un duplicado, pero las respuestas aquí son mucho mejores, especialmente la aceptada.

utilizar:

 #ifdef __linux__ //linux code goes here #elif _WIN32 // windows code goes here #else #endif 

Sé que no es una respuesta sino que se agrega si alguien busca lo mismo en Qt

En Qt

https://wiki.qt.io/Get-OS-name-in-Qt

 QString Get::osName() { #if defined(Q_OS_ANDROID) return QLatin1String("android"); #elif defined(Q_OS_BLACKBERRY) return QLatin1String("blackberry"); #elif defined(Q_OS_IOS) return QLatin1String("ios"); #elif defined(Q_OS_MAC) return QLatin1String("osx"); #elif defined(Q_OS_WINCE) return QLatin1String("wince"); #elif defined(Q_OS_WIN) return QLatin1String("windows"); #elif defined(Q_OS_LINUX) return QLatin1String("linux"); #elif defined(Q_OS_UNIX) return QLatin1String("unix"); #else return QLatin1String("unknown"); #endif } 

Tu puedes hacer

 #if MACRO0 //code... #elif MACRO1 //code... #endif 

Donde Macro puede ser:

  __linux__ Defined on Linux __sun Defined on Solaris __FreeBSD__ Defined on FreeBSD __NetBSD__ Defined on NetBSD __OpenBSD__ Defined on OpenBSD __APPLE__ Defined on Mac OS X __hpux Defined on HP-UX __osf__ Defined on Tru64 UNIX (formerly DEC OSF1) __sgi Defined on Irix _AIX Defined on AIX 

Esta respuesta no se trata de macro guerra, sino de producir un error si no se encuentra una plataforma coincidente.

 #ifdef LINUX_KEY_WORD ... // linux code goes here. #elif WINDOWS_KEY_WORD ... // windows code goes here. #else #error Platform not supported #endif 

Si #error no es compatible, puede usar la palabra clave static_assert (C ++ 0x). O puede implementar STATIC_ASSERT personalizado, o simplemente declarar una matriz de tamaño 0, o tener un interruptor que tenga casos duplicados. En resumen, producir error en tiempo de comstackción y no en tiempo de ejecución

Depende del comstackdor utilizado.

Por ejemplo, la definición de Windows puede ser WIN32 o _WIN32 .

Y la definición de Linux puede ser UNIX o __unix__ o LINUX o __linux__ .

Depende del comstackdor. Si comstack con, digamos, G ++ en Linux y VC ++ en Windows, esto hará:

 #ifdef linux ... #elif _WIN32 ... #else ... #endif 

No, estas definiciones dependen del comstackdor. Lo que puede hacer, use su propio conjunto de definiciones y configúrelas en el Makefile. Mira este hilo para más información.