2015-12-08 13 views
5

Gibt es eine Möglichkeit, Ihr Betriebssystem mit Ihrem C/C++ - Code automatisch zu erkennen? Ich brauche das für das Ausführen von plattformübergreifendem Code für Linux, Windows, sogar auf einem Raspberry Pi. Ich versuche das Betriebssystem automatisch zu erkennen, damit ich nicht in die Situation komme, dass ich nach dem Betriebssystem fragen muss, das auf dem Rechner als Eingabe läuft.Autodetection des Betriebssystems in C/C++

Ich dachte über einen Hack nach, der die Struktur des Dateisystems oder etwas ähnliches überprüft, ich weiß nicht, ob ich etwas mache oder nicht.

+0

Die Antwort darauf hängt wirklich davon ab, was Sie mit dem Unterschied erreichen wollen. Normalerweise ist es richtig, vordefinierte Makros wie Jeegar Patel zu verwenden, aber es ist oft auch nützlich, dies im Build-System zu erkennen und den richtigen Compiler auszuwählen. –

+1

Auf POSIX-Systemen, wenn Sie nativ bauen (keine Cross-Compilierung), Sie könnten 'uname' in den Build-Befehlen verwenden. –

+2

Sie wollen eine Binärdatei, die magisch auf verschiedenen Betriebssystemen ausgeführt werden kann und dann zur Laufzeit erkennt, auf welchem ​​Rechner sie läuft? Auf keinen Fall. Ich denke, dass C++ möglicherweise die falsche Lösung für Ihr Problem ist, was auch immer das sein mag. –

Antwort

6

Ich habe für die Überprüfung zwischen Linux und Windows unter Code in Vergangenheit

#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 

#ifdef _WIN32 
    printf("in Windows"); 
#endif 

#ifdef linux 
    printf("In Linux"); 
#endif 

    return 0; 
} 

Normalerweise werden alle Werkzeugkette ihre eigene vordefinierte Makros hat, so dass Sie diese Makros verwenden müssen, um zu erkennen, welche os dieser ist.

Liste solcher vordefinierten Makros.

http://sourceforge.net/p/predef/wiki/OperatingSystems/


Ja als eine Randnotiz, wird hier Erkennung von OS passiert Zeit mit Hilfe von Makros kompilieren. Entsprechend der Toolchain wird die Definition des Makros in Build gehen.

Um OS-Version in Runtime, wie in Java wir tun

System.getProperty("os.name") 

gleiche Art und Weise in C/C++ erkennen wir haben keine API.


In POSIX-Systemen 'uname' verwenden wir OS Namen bekommen können.

+0

Dies wird nicht automatisch erkannt, wie OP gefragt hat, dies ist bedingter Build. –

+0

@ GeorgeAndré Wo ist der Unterschied? – fuz

+1

@FUZxxl Hier erkennen wir os zur Kompilierzeit, keine Laufzeit. –

4

Es gibt diese handliche Liste (speichern Sie es auf der Festplatte!). Liste von predefined compiler macros.

Ich würde auch vorschlagen, dass wenn Sie auf mehrere Plattformen ausgerichtet sind, suchen Sie nach einer Bibliothek, die bereits für sie verfügbar ist.

+1

BTW, sowohl [Qt] (http://qt.io/) und [POCO] (http: // pocoproject.org /) sind plattformübergreifende C++ - Bibliotheken, die einen Blick wert sind. –