GNU/Linux >> Linux Esercitazione >  >> Linux

Compilazione condizionale in C++ basata sul sistema operativo

Il mio gcc (4.3.3) definisce le seguenti macro predefinite relative a Linux:

$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

Sotto VC++ (e molti altri compilatori Win32) ci sono anche un paio di macro predefinite che identificano la piattaforma, in particolare _WIN32. Ulteriori dettagli:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx


Non esiste un modo standard per farlo. Potrebbe essere possibile disattivare determinate macro definite per piattaforma. Ad esempio, _WIN32 sarà definito su Windows e quasi certamente non su Linux. Tuttavia non conosco alcuna macro Linux corrispondente.

Poiché si utilizzano compilatori separati, ne consegue che si dispone di ambienti di compilazione separati. Perché non aggiungere tu stesso la macro? Sia Visual Studio che GCC supportano la definizione di macro dalla riga di comando, quindi basta definirle.


Cerco sempre di mantenere le specifiche della piattaforma fuori dal codice principale in questo modo

piattaforma.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
}

Ora in windows_platform.h e linux_platform.h digiti system_related_type al tipo nativo e #define platform_SystemCall come chiamata nativa, o creare una piccola funzione wrapper, se l'argomento impostato da una piattaforma all'altra è troppo diverso.

Se le API di sistema per una particolare attività sono molto diverse tra le piattaforme, potrebbe essere necessario creare la propria API di versione che divide la differenza. Ma per la maggior parte, ci sono mappature abbastanza dirette tra le varie API su Windows e Linux.

Piuttosto che fare affidamento su qualche particolare compilatore #define per selezionare la piattaforma, io #define BUILD_PLATFORM xxx nel file di progetto o nel makefile, dal momento che devono comunque essere univoci per piattaforma.


Linux
  1. Configura Apache sul sistema operativo Ubuntu

  2. Configura il server MySQL sul sistema operativo Ubuntu

  3. Chiamare il sistema operativo per aprire l'URL?

  4. Come posso controllare il sistema operativo in Python?

  5. Che cos'è un contenitore Linux e un hypervisor Linux?

Sistema operativo Redox:un sistema operativo scritto in Rust

Introduzione al sistema operativo Linux

Linux è un sistema operativo o un kernel?

Trova i dettagli del sistema Linux usando Python

Windows vs MacOS vs Linux – Manuale del sistema operativo

I 10 migliori sistemi operativi basati su Unix