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