Generalmente se hace así (más o menos):
#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 esta forma, solo se compilará el código para Linux en una plataforma Linux, y solo el código de Windows se compilará en una plataforma Windows.
Deberías usar el mismo #ifdef
en lugar de if(OS_Windows)
lógica en tu código:
#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
}
Estás confundiendo variables (que existen en tiempo de ejecución) con símbolos de preprocesador (que solo existen durante la compilación).
Después de hacer algo como #define OS_Windows 1
, no puede usar el símbolo OS_Windows como una variable y ponerlo dentro de if()
s... Quiero decir, puedes, pero se expandirá durante la compilación a if (1)
.
Para un proyecto multiplataforma, debe usar #if
o #ifdef
para asegurarse de que el compilador elija una parte correcta del código para un sistema operativo determinado y compile solo eso.
Algo como:
void openWindow() {
#if OS_Windows
// windows-specific code goes here
#else
// linux-specific code
#endif
}
Veo muchas soluciones diferentes aquí, lo que me incomoda... ¿Qué pasa si funcionan en Linux pero no en Windows o en Windows pero no en Linux? ¿Qué pasa si solo funcionan en algunos compiladores? Etc.
Así que encontré este enlace, que me gusta:https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
Parece que estos son los mejores (usando #ifdef, #endif, etc.):
_WIN32
para Windows de 32 o 64 bits_WIN64
solo para Windows de 64 bits__unix__
para Unix