Biasanya dilakukan seperti ini (kurang lebih):
#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;
}
Dengan cara ini, hanya kode untuk linux yang akan dikompilasi saat berada di platform linux, dan hanya kode windows yang akan dikompilasi di platform windows.
Anda harus menggunakan #ifdef
yang sama bukannya if(OS_Windows)
logika dalam kode Anda:
#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
}
Anda membingungkan variabel (yang ada saat run-time) dengan simbol preprocessor (yang hanya ada selama kompilasi).
Setelah Anda melakukan sesuatu seperti #define OS_Windows 1
, Anda tidak dapat menggunakan simbol OS_Windows sebagai variabel dan memasukkannya ke dalam if()
s... Maksud saya, Anda bisa, tetapi akan diperluas selama kompilasi ke if (1)
.
Untuk proyek lintas platform, Anda harus menggunakan #if
atau #ifdef
untuk memastikan bahwa kompiler memilih bagian kode yang benar untuk OS tertentu dan mengkompilasi hanya itu.
Sesuatu seperti:
void openWindow() {
#if OS_Windows
// windows-specific code goes here
#else
// linux-specific code
#endif
}
Saya melihat banyak variasi solusi di sini, yang membuat saya tidak nyaman... Bagaimana jika mereka bekerja di Linux tetapi tidak di Windows atau di Windows tetapi tidak di Linux? Bagaimana jika mereka hanya bekerja pada beberapa kompiler? Dll.
Jadi saya menemukan tautan ini, yang saya suka:https://web.archive.org/web/20191012035921/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
Sepertinya ini yang terbaik (menggunakan #ifdef, #endif, dll.):
_WIN32
untuk Windows 32 bit ATAU 64 bit_WIN64
hanya untuk Windows 64 bit__unix__
untuk Unix