216 votes

Compilation du C++ sous Windows et Linux : commutateur ifdef

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

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 doublon, mais les réponses ici sont bien meilleures, en particulier celle qui a été acceptée.

2 votes

@MooingDuck : Je confirme que je voulais décider du système d'exploitation cible et pas nécessairement du compilateur utilisé.

269voto

Anjum Kaiser Points 1016

Utiliser :

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

#endif

23 votes

Cette réponse est en quelque sorte meilleure en ce sens qu'elle répond directement à la question, au lieu de fournir un lien vers un troisième site qui risque de mourir un jour.

2 votes

Sur mon Ubuntu Trusty, seul __linux__ œuvre. Ni l'un ni l'autre __linux ni linux travail.

3 votes

Je viens de comprendre qu'un projet que je suis en train de construire passe par -std=c++0x, qui définit __linux__ , pas __linux .

87voto

rubenvb Points 27271

La seule réponse correcte est ce glorieux site web : http://sourceforge.net/p/predef/wiki/OperatingSystems/

La magie de la macro predef est maintenant partie de l'impulsion (depuis la version 1.55.0).

81voto

user1527227 Points 327

Vous pouvez le faire :

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

où l'identifiant 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
    _WIN32          Defined on Windows

18voto

Igor Oks Points 9737

Cela dépend du compilateur utilisé.

Par exemple, la définition de Windows peut être WIN32 o _WIN32 .

Et la définition de Linux peut être UNIX o __unix__ o LINUX o __linux__ .

1 votes

Une telle norme existe. Les chaînes d'outils qui n'y adhèrent pas sont soit boguées, soit vieilles comme le monde, soit tout simplement mauvaises.

0 votes

@rubenvb : et la norme est... ? Voulez-vous poster une réponse ou au moins une URL ?

2 votes

@MestreLion Le projet Predef a depuis été absorbé par Boost, mais toutes les macros sont toujours listées dans la documentation ici : boost.org/doc/libs/release/libs/predef/doc/html/index.html

13voto

Ajay Points 5320

Cette réponse ne concerne pas la guerre des macros, mais la production d'une 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 pris en charge, vous pouvez utiliser le mot-clé static_assert (C++0x). Vous pouvez également 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 à durée d'exécution

7 votes

#error doit sont prises en charge (contrairement aux #warning qui est une extension). Mais je suis d'accord que ce n'est pas nécessairement la meilleure façon de faire échouer une construction.

4 votes

@Thomas : En effet. Heureusement, si #error n'est pas pris en charge dans une implémentation non conforme, le résultat de la déclaration incorrecte du préprocesseur est, eh bien --- une erreur. Et si ce n'est pas une erreur non plus, alors le compilateur est un VRAIMENT VRAIMENT de merde et ne vaut pas la peine d'être soutenu de toute façon (bien que je très Il n'est pas certain qu'un tel compilateur existe).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X