usa que para libreria ifdef example c++ linux windows conditional-compilation ifdefine

c++ - libreria - para que se usa#ifndef



CompilaciĆ³n de C++ en Windows y Linux: ifdef cambiar (7)

Esta pregunta ya tiene una respuesta aquí:

Quiero ejecutar algunos códigos de 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.


Depende del compilador 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 compilador. Si compila con, digamos, G ++ en Linux y VC ++ en Windows, esto hará:

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


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 compilación y no en tiempo de ejecución


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


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


utilizar:

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