salida - funcion preprocesador en c++
¿Cómo reviso el sistema operativo con una directiva de preprocesador? (13)
Necesito mi código para hacer cosas diferentes en función del sistema operativo en el que se compila. Estoy buscando algo como esto:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
¿Hay alguna forma de hacer esto? ¿Hay una mejor manera de hacer lo mismo?
Las macros predefinidas del compilador de MS se pueden encontrar aquí:
Creo que estás buscando:
_WIN32
_WIN64
compilador gcc Los MAcros predefinidos se pueden encontrar aquí:
Creo que estás buscando:
__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
Haga un google para sus compiladores apropiados predefinidos.
Basado en nadeausoftware y la respuesta de Lambda Fairy .
#include <stdio.h>
/**
* Determination a platform of an operation system
* Fully supported supported only GNU GCC/G++, partially on Clang/LLVM
*/
#if defined(_WIN32)
#define PLATFORM_NAME "windows" // Windows
#elif defined(_WIN64)
#define PLATFORM_NAME "windows" // Windows
#elif defined(__CYGWIN__) && !defined(_WIN32)
#define PLATFORM_NAME "windows" // Windows (Cygwin POSIX under Microsoft Window)
#elif defined(__ANDROID__)
#define PLATFORM_NAME "android" // Android (implies Linux, so it must come first)
#elif defined(__linux__)
#define PLATFORM_NAME "linux" // Debian, Ubuntu, Gentoo, Fedora, openSUSE, RedHat, Centos and other
#elif defined(__unix__) || defined(__APPLE__) && defined(__MACH__)
#include <sys/param.h>
#if defined(BSD)
#define PLATFORM_NAME "bsd" // FreeBSD, NetBSD, OpenBSD, DragonFly BSD
#endif
#elif defined(__hpux)
#define PLATFORM_NAME "hp-ux" // HP-UX
#elif defined(_AIX)
#define PLATFORM_NAME "aix" // IBM AIX
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR == 1
#define PLATFORM_NAME "ios" // Apple iOS
#elif TARGET_OS_IPHONE == 1
#define PLATFORM_NAME "ios" // Apple iOS
#elif TARGET_OS_MAC == 1
#define PLATFORM_NAME "osx" // Apple OSX
#endif
#elif defined(__sun) && defined(__SVR4)
#define PLATFORM_NAME "solaris" // Oracle Solaris, Open Indiana
#else
#define PLATFORM_NAME NULL
#endif
// Return a name of platform, if determined, otherwise - an empty string
char *
get_platform_name() {
return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;
}
int main(int argc, char *argv[]) {
puts(get_platform_name());
return 0;
}
Probado con GCC y clang encendido:
- Debian 8
- Windows (MinGW)
- Windows (Cygwin)
El sitio Mac predefinido para el sistema operativo tiene una lista muy completa de controles. Aquí hay algunos de ellos, con enlaces a donde se encuentran:
Windows
_WIN32
Ambos de 32 bits y 64 bits
_WIN64
solo de 64 bits
Unix (Linux, * BSD, Mac OS X)
Vea esta pregunta relacionada sobre algunos de los peligros de usar este cheque.
unix
__unix
__unix__
Mac OS X
__APPLE__
__MACH__
Ambos están definidos; la comprobación de cualquiera debería funcionar.
Linux
__linux__
linux
obsoleto (no compatible con POSIX)
__linux
Obsoleto (no compatible con POSIX)
FreeBSD
__FreeBSD__
En MinGW, la _WIN32
definición _WIN32
no está funcionando. Aquí hay una solución:
#if defined(_WIN32) || defined(__CYGWIN__)
// Windows (x86 or x64)
// ...
#elif defined(__linux__)
// Linux
// ...
#elif defined(__APPLE__) && defined(__MACH__)
// Mac OS
// ...
#elif defined(unix) || defined(__unix__) || defined(__unix)
// Unix like OS
// ...
#else
#error Unknown environment!
#endif
Para obtener más información, consulte: https://sourceforge.net/p/predef/wiki/OperatingSystems/
En la mayoría de los casos, es mejor verificar si una determinada funcionalidad está presente o no. Por ejemplo: si la función pipe()
existe o no.
No hay una macro estándar establecida de acuerdo con C estándar. Algunos compiladores C establecerán uno en algunas plataformas (por ejemplo, el GCC parcheado de Apple establece una macro para indicar que se está compilando en un sistema Apple y para la plataforma Darwin). Su plataforma y / o su compilador de C también pueden establecer algo, pero no hay una forma general.
Al igual que hayalci, es mejor tener estas macros establecidas en el proceso de compilación de alguna manera. Es fácil definir una macro con la mayoría de los compiladores sin modificar el código. Simplemente puede pasar -D MACRO
a GCC, es decir,
gcc -D Windows
gcc -D UNIX
Y en tu código:
#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
# error Unsupported operating system
#endif
Para resumir, aquí hay un montón de enlaces útiles.
Perdón por la referencia externa, pero creo que es adecuada para su pregunta:
Puede utilizar directivas de preprocesador como advertencia o error para verificar en tiempo de compilación, no necesita ejecutar este programa en absoluto, simplemente compilarlo .
#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
#error Windows_OS
#elif defined(__linux__)
#error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
#error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
#error Unix_OS
#else
#error Unknown_OS
#endif
#include <stdio.h>
int main(void)
{
return 0;
}
Use #define OSsymbol
y #ifdef OSsymbol
donde OSsymbol es un #define
capaz de identificar su sistema operativo objetivo.
Normalmente, debe incluir un archivo de cabecera central que define el símbolo del sistema operativo seleccionado y utilizar directorios de inclusión y biblioteca específicos del sistema operativo para compilar y compilar.
No especificó su entorno de desarrollo, pero estoy bastante seguro de que su compilador proporciona definiciones globales para plataformas y sistemas operativos comunes.
Ver también http://en.wikibooks.org/wiki/C_Programming/Preprocessor
mostrar las definiciones de GCC en Windows:
gcc -dM -E - <NUL:
en Linux:
gcc -dM -E - </dev/null
Macros predefinidos en MinGW:
WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386
en UNIXes:
unix __unix__ __unix
#ifdef _WIN32
// do something for windows like include <windows.h>
#elif defined __unix__
// do something for unix like include <unistd.h>
#elif defined __APPLE__
// do something for mac
#endif