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