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.):
- _WIN32per Windows 32 bit o 64 bit
- _WIN64solo per Windows a 64 bit
- __unix__per Unix