Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wanderson Regis Silva

[Resolvido] Determinar SO e compilador

Recommended Posts

Qual seria o melhor método de determinar o SO e talvez o compilador em C?

 

Já vi algumas verificações que usam algumas variáveis de ambiente como __WIN32__, mas nenhuma me pareceu conclusiva, até por que praticamente só considera windows, e eu queria detectar se é linux, unix, mac ou um outro qualquer, se é de 32 ou 64 bits, e talvez o compilador (nem tanto importante), enfim, informações do ambiente de compilação completas.

 

Alguém ai poderia me dizer um bom método ou quais seriam as variáveis de ambiente corretas a serem consideradas? E então criar (#define) constantes como OS_WIN, OS_WIN32, OS_WIN64, OS_LINUX, OS_LINUX32, OS_OSX...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode esperar um modo diferente em cada sistema operacional...

No Linux tem a variável OSTYPE. No Windows parece que é OS (http://kennethhunt.com/archives/000933.html)

 

#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%s\n",getenv("OSTYPE"));
printf("%s\n",getenv("MACHTYPE"));
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse link até q é interessante pra saber como obter dados do sistema no windows, mas como você mesmo disse, as variáveis de ambiente mudam de acordo com o sistema, e então eu precisaria saber qual o sistema pra então obter da forma correta as possíveis informações.

 

E ai, conhece alguma maneira eficiente? Pq como eu disse, os que eu achei só determinam se o ambiente é ou não windows (não cheguei a testar), mas não se é linux, mac ou qualquer outro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

... Eu já postei isso.

Se você está executando um programa, com certeza ele está rodando em um SO e p/ você a variável "sistema_operacional" é obrigatória. Inicialize a dita com "other" e vá usando as variáveis de ambiente de cada sistema operacional na chamada a getenv (que faz parte do C99) e retorna NULL se você usar uma variável não existente (é ler o manual da função p/ saber isso).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olhando os códigos fonte do Qt, achei mais ou menos o que eu queria, tirei algumas coisas que eu não precisava e ficou assim:

#include <stdio.h>

#if defined(MSDOS) || defined(_MSDOS)
#  define OS_MSDOS 1
#elif !defined(SAG_COM) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
#  define OS_WIN32 1
#  define OS_WIN64 1
#elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
#  if defined(WINCE) || defined(_WIN32_WCE)
#    define OS_WINCE 1
#  else
#    define OS_WIN32 1
#  endif
#elif defined(__MWERKS__) && defined(__INTEL__)
#  define OS_WIN32 1
#elif defined(__linux__) || defined(__linux)
#  define OS_LINUX 1
#else
#  define OS_OTHER 1
#  error "This library has not been ported to this OS"
#endif

#if defined(OS_WIN32) || defined(OS_WIN64) || defined(OS_WINCE)
#  define OS_WIN 1
#endif

#if defined(OS_MSDOS) || defined(OS_OS2) || defined(OS_WIN)
#  undef OS_UNIX
#elif !defined(OS_UNIX)
#  define OS_UNIX 1
#endif

int main(int argc, char** argv) {
#ifdef OS_WIN
  printf("OS_WIN\n");
#  ifdef OS_WIN32
  printf("OS_WIN32\n");
#  elif OS_WIN64
  printf("OS_WIN64\n");
#  elif OS_WINCE
  printf("OS_WINCE\n");
#  else
  printf("OS_WINOT\n");
#  endif
#else
#  ifdef OS_LINUX
  printf("OS_LINUX\n");
#  elif OS_MSDOS
  printf("OS_MSDOS\n");
#  else
  printf("OS_OTHER\n");
#endif
#endif

  return 0;
}
E isso deu como saída:

OS_LINUX

Compartilhar este post


Link para o post
Compartilhar em outros sites

Detalhe: o que eu falei p/ você usar são variáveis de ambiente e não defines de header. Eu tenho quase certeza que uma variável de ambiente necessária pro sistema operacional (e que vem de 'fábrica') não vai mudar de nome tão cedo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.