GNU/Linux >> Linux Esercitazione >  >> Linux

Rileva Windows o Linux in C, C++

Generalmente si fa così (più o meno):

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

In questo modo, solo il codice per Linux verrà compilato su una piattaforma Linux e solo il codice Windows verrà compilato su una piattaforma Windows.


Dovresti usare lo stesso #ifdef invece di if(OS_Windows) logica nel tuo codice:

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

Stai confondendo le variabili (che esistono in fase di esecuzione) con i simboli del preprocessore (che esistono solo durante la compilazione).

Dopo aver fatto qualcosa come #define OS_Windows 1 , non puoi utilizzare il simbolo OS_Windows come variabile e inserirlo all'interno di if() s... Voglio dire, puoi, ma verrà espanso durante la compilazione a if (1) .

Per un progetto multipiattaforma, devi utilizzare #if o #ifdef per assicurarsi che il compilatore scelga una parte corretta del codice per un determinato sistema operativo e compili solo quello.

Qualcosa come:

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

Vedo molte soluzioni diverse qui, il che mi mette a disagio... E se funzionano su Linux ma non su Windows o su Windows ma non su Linux? E se funzionassero solo su alcuni compilatori? Ecc.

Così ho trovato questo link, che mi piace:https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

Sembra che questi siano i migliori (usando #ifdef, #endif, ecc.):

  • _WIN32 per Windows 32 bit o 64 bit
  • _WIN64 solo per Windows a 64 bit
  • __unix__ per Unix

Linux
  1. 10 MOTIVI PER CAMBIARE WINDOWS 10 IN LINUX

  2. Linux:come disinstallare Grub?

  3. Hosting Linux vs Windows

  4. Correzione dell'installazione di installazione di Windows o Linux Impossibile rilevare l'unità disco rigido SATA

  5. Script PHP:rileva se è in esecuzione su Linux o Windows?

Le migliori distribuzioni Linux alternative a Windows XP

Sfruttare un host Linux Windows 11 come amministratore IT

Installa Windows 10 su Linux con VirtualBox

Dovrei scegliere Linux Server o Windows?

Sicurezza Linux vs Windows

I contenitori Windows possono essere ospitati su Linux?