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