GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erkennen Sie Windows oder Linux in C, C++

Es wird im Allgemeinen so gemacht (mehr oder weniger):

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

Auf diese Weise wird auf einer Linux-Plattform nur Code für Linux und auf einer Windows-Plattform nur Windows-Code kompiliert.


Sie sollten denselben #ifdef verwenden statt if(OS_Windows) Logik in Ihrem 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    
}

Sie verwechseln Variablen (die zur Laufzeit existieren) mit Präprozessorsymbolen (die nur während der Kompilierung existieren).

Nachdem Sie etwas wie #define OS_Windows 1 getan haben , können Sie das Symbol OS_Windows nicht als Variable verwenden und es in if() einfügen s... Ich meine, Sie können, aber es wird während der Kompilierung auf if (1) erweitert .

Für ein plattformübergreifendes Projekt müssen Sie #if verwenden oder #ifdef um sicherzustellen, dass der Compiler den richtigen Teil des Codes für ein bestimmtes Betriebssystem auswählt und nur diesen kompiliert.

Etwas wie:

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

Ich sehe hier viele unterschiedliche Lösungen, was mich unbehaglich macht ... Was ist, wenn sie unter Linux, aber nicht unter Windows oder unter Windows, aber nicht unter Linux funktionieren? Was ist, wenn sie nur auf einigen Compilern funktionieren? usw.

Also habe ich diesen Link gefunden, der mir gefällt:https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

Es sieht so aus, als wären diese am besten (mit #ifdef, #endif usw.):

  • _WIN32 für Windows 32 Bit ODER 64 Bit
  • _WIN64 nur für Windows 64-Bit
  • __unix__ für Unix

Linux
  1. 10 GRÜNDE, WINDOWS 10 AUF LINUX ZU ÄNDERN

  2. Linux – Wie deinstalliere ich Grub?

  3. Linux vs. Windows-Hosting

  4. C++-Kompilierung unter Windows und Linux:ifdef-Schalter

  5. So kompilieren Sie Windows Visual C++-Code unter Linux

Top alternative Linux-Distributionen zu Windows XP

Nutzung eines Windows 11 Linux-Hosts als IT-Administrator

Installieren Sie Windows 10 unter Linux mit VirtualBox

Soll ich Linux Server oder Windows wählen?

Linux vs. Windows-Sicherheit

Können Windows-Container unter Linux gehostet werden?