Estou escrevendo um código de plataforma cruzada, que deve compilar em linux, windows, Mac OS. No windows, devo apoiar o visual studio e o mingw.
Existem algumas partes do código específico da plataforma, que devo colocar no #ifdef .. #endif
ambiente. Por exemplo, coloquei aqui o código específico do win32:
#ifdef WIN32
#include <windows.h>
#endif
Mas como faço para reconhecer o linux e o mac OS? Quais são os nomes de definição (ou etc.) que devo usar?
c++
macros
cross-platform
c-preprocessor
Arenim
fonte
fonte
Respostas:
Para Mac OS :
Para MingW no Windows:
Para Linux :
Para outros compiladores do Windows, verifique este tópico e este para vários outros compiladores e arquiteturas.
fonte
__APPLE__
distinção entre OSX e iOS?__APPLE__
está definido para OS X e iOS. Você pode#include <TargetConditionals.h>
entrar#ifdef __APPLE__
, o que lhe dá umTARGET_OS_IPHONE #define
.__MINGW64__
também está disponível quando se usa mingw64__MINGW64__
é referenciado,_MSC_VER
vale a pena mencionar para Windows / MSVC (que também pode ser usado para verificar a versão do MSVC).Veja: http://predef.sourceforge.net/index.php
Este projeto fornece uma lista razoavelmente abrangente de pré-definidos
#defines
para muitos sistemas operacionais, compiladores, padrões de linguagem e plataforma e bibliotecas padrão.fonte
Aqui está o que eu uso:
EDITAR: Embora o acima possa funcionar para o básico, lembre-se de verificar qual macro você deseja verificar olhando as páginas de referência do Boost.Predef . Ou apenas use Boost.Predef diretamente.
fonte
#if
pergunta se definido, os outros testam o valor. Seria mais consistente fazer#elif defined(__unix__)
, etc, eu acho.Se você está escrevendo C ++, não posso recomendar o uso das bibliotecas Boost com força suficiente.
A versão mais recente (1.55) inclui uma nova biblioteca Predef que cobre exatamente o que você está procurando , junto com dezenas de outras macros de reconhecimento de plataforma e arquitetura.
fonte