Comment détecter Mac OS X, iOS, Linux, Windows de manière fiable dans un préprocesseur C?
S'il y a du code c/" class="blnk">C/C++ multiplate-forme qui devrait être compilé sur Mac OS X, iOS, Linux, Windows, Comment puis-je les détecter de manière fiable pendant le processus de préprocesseur?
3 réponses
il y a des macros prédéfinies qui sont utilisées par la plupart des compilateurs, vous pouvez trouver la liste ici . GCC compilateur macros prédéfinies peuvent être trouvées ici . Voici un exemple pour gcc:
#ifdef _WIN32
//define something for Windows (32-bit and 64-bit, this part is common)
#ifdef _WIN64
//define something for Windows (64-bit only)
#else
//define something for Windows (32-bit only)
#endif
#elif __APPLE__
#include "TargetConditionals.h"
#if TARGET_IPHONE_SIMULATOR
// iOS Simulator
#elif TARGET_OS_IPHONE
// iOS device
#elif TARGET_OS_MAC
// Other kinds of Mac OS
#else
# error "Unknown Apple platform"
#endif
#elif __linux__
// linux
#elif __unix__ // all unices not caught above
// Unix
#elif defined(_POSIX_VERSION)
// POSIX
#else
# error "Unknown compiler"
#endif
Les macros définies dépend du compilateur que vous allez utiliser.
le _WIN64
#ifdef
peut être imbriqué dans le _WIN32
#ifdef
parce que _WIN32
est défini cibler Windows, pas seulement la version x86. Cela évite la duplication de code si certaines inclusions sont communes aux deux.
comme Jake le souligne, TARGET_IPHONE_SIMULATOR est un sous-ensemble de TARGET_OS_IPHONE.
TARGET_OS_IPHONE est un sous-ensemble de TARGET_OS_MAC.
donc une meilleure approche pourrait être:
#ifdef _WIN64
//define something for Windows (64-bit)
#elif _WIN32
//define something for Windows (32-bit)
#elif __APPLE__
#include "TargetConditionals.h"
#if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR
// define something for simulator
#elif TARGET_OS_IPHONE
// define something for iphone
#else
#define TARGET_OS_OSX 1
// define something for OSX
#endif
#elif __linux
// linux
#elif __unix // all unices not caught above
// Unix
#elif __posix
// POSIX
#endif
sorte de réponse corollaire: les gens sur [ce site] ont pris le temps de faire des tableaux de macros définis pour chaque paire OS/compilateur .
par exemple, vous pouvez voir que _WIN32
N'est pas défini sur Windows avec Cygwin (POSIX), alors qu'il est défini pour compilation sur Windows, Cygwin (non-POSIX), et MinGW avec tous les compilateurs disponibles (Clang, GNU, Intel, etc.).
de toute façon, j'ai trouvé les tables sont très instructives et j'ai pensé partager ici.