J'ai besoin que mon code fasse différentes choses en fonction du système d'exploitation sur lequel il est compilé. Je cherche quelque chose comme ça:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Y a-t-il un moyen de faire cela? Y a-t-il une meilleure façon de faire la même chose?
c
operating-system
c-preprocessor
conditional-compilation
perimosocordiae
la source
la source
C
ne pasC++
Réponses:
Le site Macros prédéfinies pour OS a une liste très complète de vérifications. En voici quelques-uns, avec des liens vers où ils se trouvent:
les fenêtres
_WIN32
32 bits et 64 bits_WIN64
64 bits uniquementUnix (Linux, * BSD, Mac OS X)
Voir cette question connexe sur certains des pièges de l'utilisation de cette vérification.
unix
__unix
__unix__
Mac OS X
__APPLE__
__MACH__
Les deux sont définis; vérifier l'un ou l'autre devrait fonctionner.
Linux
__linux__
linux
Obsolète (non conforme POSIX)__linux
Obsolète (non conforme POSIX)FreeBSD
__FreeBSD__
Android
__ANDROID__
la source
__unix__
. Pourquoi l'incluriez-vous dans la liste?unix
symboles et ne définit paswin32
ceux, donc soyez prudent. OTOH, il définit__CYGWIN__
.__linux__
même que__ANDROID__
??show GCC définit sur Windows:
sous Linux:
Macros prédéfinies dans MinGW:
sous UNIX:
la source
Basé sur nadeausoftware et la réponse 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 const char *get_platform_name() { return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME; } int main(int argc, char *argv[]) { puts(get_platform_name()); return 0; }
Testé avec GCC et retentit sur:
la source
Dans la plupart des cas, il est préférable de vérifier si une fonctionnalité donnée est présente ou non. Par exemple: si la fonction
pipe()
existe ou non.la source
#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
la source
Les macros prédéfinies du compilateur Microsoft C / C ++ (MSVC) peuvent être trouvées ici
Je pense que vous recherchez:
Les MAcros prédéfinis du compilateur gcc peuvent être trouvés ici
Je pense que vous recherchez:
Faites un google pour vos compilateurs appropriés prédéfinis.
la source
Il n'y a pas de macro standard définie selon la norme C. Certains compilateurs C en définiront un sur certaines plates-formes (par exemple, le GCC corrigé d'Apple définit une macro pour indiquer qu'il compile sur un système Apple et pour la plate-forme Darwin). Votre plate-forme et / ou votre compilateur C peuvent également définir quelque chose, mais il n'y a pas de moyen général.
Comme l'a dit hayalci, il est préférable que ces macros soient définies dans votre processus de construction. Il est facile de définir une macro avec la plupart des compilateurs sans modifier le code. Vous pouvez simplement passer
-D MACRO
à GCC, c'est-à-direEt dans votre code:
la source
Sur MinGW, la
_WIN32
vérification de définition ne fonctionne pas. Voici une solution:#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
Pour plus d'informations, veuillez consulter: https://sourceforge.net/p/predef/wiki/OperatingSystems/
la source
Utilisez
#define OSsymbol
et#ifdef OSsymbol
où OSsymbol est un#define
symbole capable identifiant votre OS cible.En règle générale, vous incluez un fichier d'en-tête central définissant le symbole du système d'exploitation sélectionné et utilisez des répertoires d'inclusion et de bibliothèque spécifiques au système d'exploitation pour compiler et construire.
Vous n'avez pas spécifié votre environnement de développement, mais je suis presque sûr que votre compilateur fournit des définitions globales pour les plates-formes et les systèmes d'exploitation courants.
Voir aussi http://en.wikibooks.org/wiki/C_Programming/Preprocessor
la source
Pour résumer le tout, voici un tas de liens utiles.
libportable
la source
Désolé pour la référence externe, mais je pense que cela convient à votre question:
Conseil C / C ++: Comment détecter le type de système d'exploitation à l'aide de macros prédéfinies par le compilateur
la source
Vous pouvez utiliser
Boost.Predef
qui contient diverses macros prédéfinies pour la plate-forme cible, y compris le système d'exploitation (BOOST_OS_*
). Oui, boost est souvent considéré comme une bibliothèque C ++, mais celui-ci est un en-tête de préprocesseur qui fonctionne également avec C!Par exemple
#include <boost/predef.h> #if defined(BOOST_OS_WINDOWS) #elif defined(BOOST_OS_ANDROID) #elif defined(BOOST_OS_LINUX) #elif defined(BOOST_OS_BSD) #elif defined(BOOST_OS_AIX) #elif defined(BOOST_OS_HAIKU) ... #endif
La liste complète se trouve dans
BOOST_OS
les macros du système d'exploitationVoir aussi Comment obtenir des identifiants de plateforme à partir de boost
la source
Je n'ai pas trouvé de définition de Haiku ici. Pour être complète, la définition Haiku-os est simple
__HAIKU__
la source
Certains compilateurs généreront des #defines qui peuvent vous aider. Lisez la documentation du compilateur pour déterminer ce qu'ils sont. MSVC en définit un qui est
__WIN32__
, GCC en a que vous pouvez voir avectouch foo.h; gcc -dM foo.h
la source
Vous pouvez utiliser des directives de pré-processeur comme avertissement ou erreur pour vérifier au moment de la compilation que vous n'avez pas du tout besoin d' exécuter ce programme, il suffit de le compiler .
#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; }
la source
J'ai écrit une petite bibliothèque pour obtenir le système d'exploitation sur lequel vous êtes, elle peut être installée en utilisant clib (le gestionnaire de paquets C), donc c'est vraiment simple de l'utiliser comme dépendance pour vos projets.
Installer
Usage
#include <stdio.h> #include "os.h" int main() { printf("%s\n", operating_system()); // macOS return 0; }
Il renvoie une chaîne (
char*
) avec le nom du système d'exploitation que vous utilisez, pour plus d'informations sur ce projet, consultez-le la documentation sur Github .la source