todas salida que procesador preprocesamiento preprocesador lenguaje las informatica ifdef funciones funcion entrada encuentran ejemplos directivas directiva define cual c operating-system c-preprocessor

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í:

Windows

Creo que estás buscando:

_WIN32
_WIN64

compilador gcc Los MAcros predefinidos se pueden encontrar aquí:

http://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html

Creo que estás buscando:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__

Haga un google para sus compiladores apropiados predefinidos.


Algunos compiladores generarán # definiciones que pueden ayudarlo con esto. Lea la documentación del compilador para determinar cuáles son. MSVC define uno que es __WIN32__ , GCC tiene algunos que puede ver con touch foo.h; gcc -dM foo.h touch foo.h; gcc -dM foo.h


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



Perdón por la referencia externa, pero creo que es adecuada para su pregunta:

nadeausoftware


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