C++ compiler sous Windows et Linux: commutateur ifdef [dupliquer]
cette question a déjà une réponse ici:
je veux lancer du code c++ sur Linux et Windows. Il y a quelques morceaux de code que je veux inclure seulement pour un système d'exploitation et pas l'autre. Être il y a une norme #ifdef qu'une fois peut utiliser?
quelque chose comme:
#ifdef LINUX_KEY_WORD
... // linux code goes here.
#elif WINDOWS_KEY_WORD
... // windows code goes here.
#else
#error "OS not supported!"
#endif
la question Est en effet un double mais les réponses ici sont beaucoup mieux, en particulier celle acceptée.
7 réponses
utiliser:
#ifdef __linux__
//linux code goes here
#elif _WIN32
// windows code goes here
#else
#endif
je sais que ce n'est pas la réponse, mais a ajouté que si quelqu'un cherche même dans Qt
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
}
Vous pouvez le faire
#if MACRO0
//code...
#elif MACRO1
//code...
#endif
où Macro peut être:
__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
cette réponse ne concerne pas la macro-guerre, mais la production d'erreur si aucune plate-forme correspondante n'est trouvée.
#ifdef LINUX_KEY_WORD
... // linux code goes here.
#elif WINDOWS_KEY_WORD
... // windows code goes here.
#else
#error Platform not supported
#endif
si #error
n'est pas supporté, vous pouvez utiliser le mot-clé static_assert (C++0x). Ou vous pouvez implémenter un STATIC_ASSERT personnalisé, ou simplement déclarer un tableau de taille 0, ou avoir un commutateur qui a des cas dupliqués. En bref, produire une erreur à temps de compilation et non à temps d'exécution
Cela dépend du compilateur utilisé.
par exemple, la définition de Windows peut être WIN32
ou _WIN32
.
et la définition de Linux peut être UNIX
ou __unix__
ou LINUX
ou __linux__
.
Cela dépend du compilateur. Si vous compilez avec, disons, G++ sous Linux et VC++ sous Windows, cela fera :
#ifdef linux
...
#elif _WIN32
...
#else
...
#endif