Gcc (4.3.3) saya mendefinisikan makro standar terkait Linux berikut:
$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
Di bawah VC++ (dan banyak kompiler Win32 lainnya) ada juga beberapa makro standar yang mengidentifikasi platform, terutama _WIN32. Detail lebih lanjut:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
Tidak ada cara standar untuk melakukan ini. Dimungkinkan untuk mematikan makro tertentu yang ditentukan per platform. Misalnya, _WIN32 akan ditentukan di Windows dan hampir pasti bukan Linux. Namun saya tidak tahu makro Linux yang sesuai.
Karena Anda menggunakan kompiler terpisah, Anda memiliki lingkungan build yang terpisah. Mengapa tidak menambahkan makro saja sendiri? Visual Studio dan GCC mendukung definisi makro dari baris perintah, jadi definisikan saja.
Saya selalu mencoba untuk menjaga spesifikasi platform dari kode utama dengan melakukannya dengan cara ini
platform.h:
#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif
someclass.c:
void SomeClass::SomeFunction()
{
system_related_type t;
// Other code
platform_SystemCall(&t);
// Other code
}
Sekarang di windows_platform.h
dan linux_platform.h
Anda mengetikkan system_related_type
ke tipe asli, dan #define platform_SystemCall
sebagai panggilan asli, atau buat fungsi pembungkus kecil, jika argumen yang ditetapkan dari satu platform ke platform lainnya terlalu berbeda.
Jika API sistem untuk tugas tertentu sangat berbeda di antara platform, Anda mungkin perlu membuat API versi Anda sendiri yang memisahkan perbedaannya. Namun sebagian besar, terdapat pemetaan yang cukup langsung antara berbagai API di Windows dan Linux.
Daripada mengandalkan kompiler tertentu #define untuk memilih platform, saya #define BUILD_PLATFORM xxx
dalam file proyek atau makefile, karena itu harus unik menurut platform.