GNU/Linux >> Znalost Linux >  >> Linux

Detekce Windows nebo Linuxu v C, C++

Obecně se to dělá takto (víceméně):

#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;
}

Tímto způsobem bude zkompilován pouze kód pro linux na platformě linux a pouze kód pro Windows bude zkompilován na platformě Windows.


Měli byste použít stejný #ifdef místo if(OS_Windows) logika ve vašem kódu:

#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    
}

Pletete si proměnné (které existují za běhu) se symboly preprocesoru (které existují pouze během kompilace).

Poté, co uděláte něco jako #define OS_Windows 1 , nemůžete použít symbol OS_Windows jako proměnnou a vložit jej do if() s... Chci říct, můžete, ale během kompilace se to rozbalí na if (1) .

Pro multiplatformní projekt musíte použít #if nebo #ifdef abyste se ujistili, že kompilátor vybere správnou část kódu pro daný operační systém a zkompiluje pouze tuto.

Něco jako:

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

Vidím zde mnoho různých řešení, což je mi nepříjemné... Co když fungují na Linuxu, ale ne na Windows nebo na Windows, ale ne na Linuxu? Co když fungují jen na některých kompilátorech? atd.

Tak jsem našel tento odkaz, který se mi líbí:https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

Zdá se, že tyto jsou nejlepší (pomocí #ifdef, #endif atd.):

  • _WIN32 pro Windows 32bitový NEBO 64bitový
  • _WIN64 pouze pro 64bitový systém Windows
  • __unix__ pro Unix

Linux
  1. Linux vs Windows hosting

  2. Opravit instalaci systému Windows nebo Linux Instalace Nelze detekovat pevný disk SATA

  3. PHP skript - zjistit, zda běží pod linuxem nebo pod Windows?

  1. 10 DŮVODŮ PRO ZMĚNU WINDOWS 10 NA LINUX

  2. Linux – Jak odinstalovat Grub?

  3. Kompilace C++ na Windows a Linux:přepínač ifdef

  1. 5 nejlepších OS Linux, které nahradí Windows XP

  2. Jak zkompilovat kód Windows Visual C++ na Linuxu

  3. exFAT vs NTFS na Linuxu