GNU/Linux >> Belajar Linux >  >> Linux

Kompilasi bersyarat dalam C++ berdasarkan sistem operasi

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.


Linux
  1. Instal Docker (Sistem Operasi Berbasis Debian)

  2. Ubah Port SSH di sistem operasi Linux Ubuntu

  3. Instal IMAP untuk PHP 7.1 di sistem operasi Ubuntu

  1. Jadwalkan reboot di sistem operasi Ubuntu

  2. Bagaimana cara memeriksa sistem operasi dengan Python?

  3. Kemungkinan bersyarat berdasarkan stdout hasil?

  1. Query sistem operasi Linux Anda seperti database

  2. Apa itu wadah Linux dan hypervisor Linux?

  3. Android - Distribusi linux apa yang berbasis Android?