Eu preciso do meu código para fazer coisas diferentes com base no sistema operacional no qual é compilado. Estou procurando algo parecido com isto:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Existe uma maneira de fazer isso? Existe uma maneira melhor de fazer a mesma coisa?
c
operating-system
c-preprocessor
conditional-compilation
perimosocordiae
fonte
fonte
C
nãoC++
Respostas:
O site Predefined Macros for OS possui uma lista muito completa de verificações. Aqui estão alguns deles, com links para onde eles são encontrados:
janelas
_WIN32
32 e 64 bits_WIN64
Somente 64 bitsUnix (Linux, * BSD, Mac OS X)
Veja esta pergunta relacionada em algumas das armadilhas do uso dessa verificação.
unix
__unix
__unix__
Mac OS X
__APPLE__
__MACH__
Ambos são definidos; a verificação de qualquer um deve funcionar.
Linux
__linux__
linux
Obsoleto (não compatível com POSIX)__linux
Obsoleto (não compatível com POSIX)FreeBSD
__FreeBSD__
Android
__ANDROID__
fonte
__unix__
. Por que você o incluiria na lista?unix
símbolos e não os definewin32
, portanto, tenha cuidado. OTOH ele define__CYGWIN__
.__linux__
mesmo que__ANDROID__
??mostre o GCC define no Windows:
no Linux:
Macros predefinidas no MinGW:
no UNIX:
fonte
Baseado no nadeausoftware e na resposta da Lambda Fairy .
Testado com o GCC e clang em:
fonte
Na maioria dos casos, é melhor verificar se uma determinada funcionalidade está presente ou não. Por exemplo: se a função
pipe()
existe ou não.fonte
fonte
Macros predefinidas do Microsoft C / C ++ compiler (MSVC) podem ser encontradas aqui
Eu acho que você está procurando:
O compilador gcc PreDefined MAcros pode ser encontrado aqui
Eu acho que você está procurando:
Faça um google para seus compiladores apropriados predefinidos.
fonte
Não há macro padrão definida de acordo com o padrão C. Alguns compiladores C definirão um em algumas plataformas (por exemplo, o GCC corrigido da Apple define uma macro para indicar que está compilando em um sistema Apple e para a plataforma Darwin). Sua plataforma e / ou seu compilador C podem definir algo também, mas não há uma maneira geral.
Como hayalci disse, é melhor ter essas macros definidas no seu processo de criação de alguma forma. É fácil definir uma macro com a maioria dos compiladores sem modificar o código. Você pode simplesmente passar
-D MACRO
para o GCC, ou seja,E no seu código:
fonte
No MinGW, a
_WIN32
verificação de definição não está funcionando. Aqui está uma solução:Para mais informações, consulte: https://sourceforge.net/p/predef/wiki/OperatingSystems/
fonte
Use
#define OSsymbol
e#ifdef OSsymbol
onde OSsymbol é um#define
símbolo 'capaz de identificar seu SO de destino.Normalmente, você incluiria um arquivo de cabeçalho central definindo o símbolo do sistema operacional selecionado e usaria os diretórios de inclusão e biblioteca específicos do sistema operacional para compilar e construir.
Você não especificou seu ambiente de desenvolvimento, mas tenho certeza de que seu compilador fornece definições globais para plataformas e sistemas operacionais comuns.
Veja também http://en.wikibooks.org/wiki/C_Programming/Preprocessor
fonte
Apenas para resumir tudo, aqui estão alguns links úteis.
libportable
fonte
Desculpe a referência externa, mas acho que é adequada à sua pergunta:
Dica C / C ++: Como detectar o tipo de sistema operacional usando macros predefinidas do compilador
fonte
Você pode usar o
Boost.Predef
que contém várias macros predefinidas para a plataforma de destino, incluindo o SO (BOOST_OS_*
). Sim, o aumento é geralmente considerado uma biblioteca C ++, mas este é um cabeçalho de pré-processador que também funciona com C!Por exemplo
A lista completa pode ser encontrada nas
BOOST_OS
macros do sistema operacionalfonte
Não encontrei a definição de haicais aqui. Para ser completa, a definição do Haiku-os é simples
__HAIKU__
fonte
Alguns compiladores geram #defines que podem ajudá-lo com isso. Leia a documentação do compilador para determinar o que são. MSVC define um que é
__WIN32__
, o GCC tem alguns que você pode ver comtouch foo.h; gcc -dM foo.h
fonte
Você pode usar as diretivas do pré-processador como aviso ou erro para verificar, no tempo de compilação, se você não precisa executar este programa, simplesmente compile -o.
fonte
Eu escrevi uma pequena biblioteca para obter o sistema operacional em que você está, ele pode ser instalado usando o clib (gerenciador de pacotes C), por isso é muito simples de usá-lo como uma dependência para seus projetos.
Instalar
Uso
Ele retorna uma string (
char*
) com o nome do sistema operacional que você está usando, para obter mais informações sobre este projeto, consulte a documentação no Github .fonte