GNU/Linux >> Tutoriels Linux >  >> Linux

Détecter Windows ou Linux en C, C++

C'est généralement fait comme ça (plus ou moins) :

#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 cette façon, seul le code pour Linux sera compilé sur une plate-forme Linux, et seul le code Windows sera compilé sur une plate-forme Windows.


Vous devez utiliser le même #ifdef au lieu de if(OS_Windows) logique dans votre code :

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

Vous confondez des variables (qui existent à l'exécution) avec des symboles de préprocesseur (qui n'existent que lors de la compilation).

Après avoir fait quelque chose comme #define OS_Windows 1 , vous ne pouvez pas utiliser le symbole OS_Windows comme variable et le mettre dans if() s... Je veux dire, vous pouvez, mais il sera étendu lors de la compilation à if (1) .

Pour un projet multiplateforme, vous devez utiliser #if ou #ifdef pour s'assurer que le compilateur choisit une partie de code correcte pour un système d'exploitation donné et ne compile que cela.

Quelque chose comme :

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

Je vois beaucoup de solutions différentes ici, ce qui me met mal à l'aise... Et si elles fonctionnent sur Linux mais pas Windows ou sur Windows mais pas Linux ? Et s'ils ne fonctionnent que sur certains compilateurs ? Etc.

J'ai donc trouvé ce lien, qui me plaît :https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

Il semble que ceux-ci soient les meilleurs (en utilisant #ifdef, #endif, etc.) :

  • _WIN32 pour Windows 32 bits OU 64 bits
  • _WIN64 pour Windows 64 bits uniquement
  • __unix__ pour Unix

Linux
  1. 10 RAISONS DE CHANGER WINDOWS 10 VERS LINUX

  2. Linux – Comment désinstaller Grub ?

  3. Hébergement Linux vs Windows

  4. Script PHP - détecter s'il s'exécute sous Linux ou Windows ?

  5. Comment compiler du code Windows Visual C++ sous Linux

Principales distributions Linux alternatives à Windows XP

Tirer parti d'un hôte Linux Windows 11 en tant qu'administrateur informatique

Installer Windows 10 sur Linux avec VirtualBox

Dois-je choisir Linux Server ou Windows ?

Sécurité Linux contre Windows

Les conteneurs Windows peuvent-ils être hébergés sur Linux ?