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.

132
demandé sur Sardathrion 2011-07-11 16:15:55

7 réponses

utiliser:

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

#endif
125
répondu Anjum Kaiser 2011-07-11 12:21:15

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
}
31
répondu Yash 2015-09-25 10:48:00

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
28
répondu user1527227 2014-03-24 22:54:01

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

12
répondu Ajay 2011-07-11 15:41:16

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

9
répondu Igor Oks 2011-07-11 15:10:24

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
5
répondu user703016 2011-07-11 12:23:19

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

1
répondu Vitor 2017-05-23 12:03:02