GNU/Linux >> Tutoriales Linux >  >> Linux

Detectar Windows o Linux en C, C++

Generalmente se hace así (más o menos):

#ifdef _WIN32
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#define DIV 1048576 
#define WIDTH 7
#endif

#ifdef linux
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#endif


int main(int argc, char *argv[]) 
{
#ifdef _WIN32
MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx (&statex);

    _tprintf (TEXT("There is  %*ld %% of memory in use.\n"),
            WIDTH, statex.dwMemoryLoad);
#endif

#ifdef linux
char cmd[30];
int flag = 0;   
FILE *fp;
char line[130];     
int TotalMem, TotalFree, TotalUsed;

flag=0;
memcpy (cmd,"\0",30);
sprintf(cmd,"free -t -m|grep Total");          
fp = popen(cmd, "r");       
while ( fgets( line, sizeof line, fp))
{   
    flag++;
    sscanf(line,"%*s %d %d %d",&TotalMem, &TotalUsed, &TotalFree);
}
pclose(fp); 

if(flag)
    printf("TotalMem:%d -- TotalUsed:%d -- TotalFree:%d\n",TotalMem,TotalUsed,TotalFree);
else 
    printf("not found\n");
#endif

    return 0;
}

De esta forma, solo se compilará el código para Linux en una plataforma Linux, y solo el código de Windows se compilará en una plataforma Windows.


Deberías usar el mismo #ifdef en lugar de if(OS_Windows) lógica en tu código:

#ifdef __unix__         
...
#elif defined(_WIN32) || defined(WIN32) 

#define OS_Windows

#endif

int main(int argc, char *argv[]) 
{
#ifdef OS_Windows
 /* Windows code */
#else
 /* GNU/Linux code */
#endif    
}

Estás confundiendo variables (que existen en tiempo de ejecución) con símbolos de preprocesador (que solo existen durante la compilación).

Después de hacer algo como #define OS_Windows 1 , no puede usar el símbolo OS_Windows como una variable y ponerlo dentro de if() s... Quiero decir, puedes, pero se expandirá durante la compilación a if (1) .

Para un proyecto multiplataforma, debe usar #if o #ifdef para asegurarse de que el compilador elija una parte correcta del código para un sistema operativo determinado y compile solo eso.

Algo como:

void openWindow() {
#if OS_Windows
    // windows-specific code goes here
#else
    // linux-specific code
#endif
}

Veo muchas soluciones diferentes aquí, lo que me incomoda... ¿Qué pasa si funcionan en Linux pero no en Windows o en Windows pero no en Linux? ¿Qué pasa si solo funcionan en algunos compiladores? Etc.

Así que encontré este enlace, que me gusta:https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

Parece que estos son los mejores (usando #ifdef, #endif, etc.):

  • _WIN32 para Windows de 32 o 64 bits
  • _WIN64 solo para Windows de 64 bits
  • __unix__ para Unix

Linux
  1. 10 RAZONES PARA CAMBIAR WINDOWS 10 A LINUX

  2. Linux – ¿Cómo desinstalar Grub?

  3. Arreglar la instalación de instalación de Windows o Linux que no puede detectar la unidad de disco duro SATA

  4. Compilación de C++ en Windows y Linux:cambio ifdef

  5. Cómo compilar código de Windows Visual C++ en Linux

Principales distribuciones de Linux alternativas a Windows XP

Aprovechar un host Linux con Windows 11 como administrador de TI

Instalar Windows 10 en Linux con VirtualBox

¿Debo elegir un servidor Linux o Windows?

Seguridad de Linux frente a Windows

¿Se pueden alojar los contenedores de Windows en Linux?