web-dev-qa-db-fra.com

Compilation C ++ sous Windows et Linux: commutateur ifdef

Je veux exécuter du code c ++ sur Linux et Windows. Il y a des morceaux de code que je veux inclure uniquement pour un système d'exploitation et pas pour l'autre. Existe-t-il un standard # ifdef qu'une fois utilisable?

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 fait un doublon mais les réponses ici sont bien meilleures, surtout celle acceptée.

153
Sardathrion

utilisation:

#ifdef __linux__ 
    //linux code goes here
#Elif _WIN32
    // windows code goes here
#else

#endif
158

Tu peux faire

#if MACRO0
    //code...
#Elif MACRO1
    //code...
#endif

Où la 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
35
user1527227

Je sais que ce n’est pas une réponse, mais une addition si quelqu'un qui cherche le même

En 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
}
34
Yash

Cette réponse ne concerne pas la guerre des macro, mais génère une erreur si aucune plateforme 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 pris en charge, vous pouvez utiliser le mot clé static_assert (C++ 0x). Ou vous pouvez implémenter STATIC_ASSERT personnalisé, ou simplement déclarer un tableau de taille 0, ou avoir un commutateur ayant des cas dupliqués. En bref, produire une erreur à compilation et non à exécution

12
Ajay

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__.

12
Igor Oks

Cela dépend du compilateur. Si vous compilez avec, par exemple, G ++ sous Linux et VC++ sous Windows, vous obtiendrez ce résultat:

#ifdef linux
    ...
#Elif _WIN32
    ...
#else
    ...
#endif
6
user703016

Non, ces définitions dépendent du compilateur. Ce que vous pouvez faire, utilisez votre propre ensemble de définitions et définissez-les sur le Makefile. Voir ce fil pour plus d'informations.

2
Vitor