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