2009-07-13 11 views
6

Ich schreibe eine kleine Bibliothek in C++, die ich auf einigen verschiedenen Plattformen, einschließlich iPhone, Windows, Linux, Mac und Symbian S60 bauen kann. Ich habe den Großteil des Codes so geschrieben, dass er plattformunabhängig ist, aber es gibt einige Teile, die pro Plattform geschrieben werden müssen.Platform C Preprocessor Definitionen

Derzeit beende ich dies, indem ich einen anderen Header je nach der aktuellen Plattform einfüge, aber ich habe Probleme damit, dies zu erklären, weil ich nicht sicher bin, welche Präprozessordefinitionen für alle Plattformen definiert sind. Für Windows kann ich im Allgemeinen WIN32 oder _WIN32 sehen. Für Linux kann ich mich darauf verlassen, _UNIX_ zu sehen, aber ich bin weniger sicher über die anderen Plattformen oder ihre 64-Bit-Varianten. Hat jemand eine Liste der verschiedenen Definitionen auf Plattformen oder muss ich auf eine Konfigurationsdatei oder einen GCC-Parameter zurückgreifen?

Antwort

9

Ich habe this sourceforge pre-compiler Seite in meinen Lesezeichen.

+0

Ich habe Ihren Link geändert, um auf die neue Wiki-Version zu verweisen, die viel aktueller ist, obwohl Google immer auf die alte Version verweist . – rubenvb

+0

Das ist OK, danke. –

0

Weder der C- noch der C++ - Standard definieren solche Symbole, so dass Sie bestimmten C- oder C++ - Implementierungen ausgeliefert sind. Eine Liste häufig verwendeter Symbole wäre eine nützliche Sache, aber leider habe ich keine.

0

Ich glaube nicht, dass es eine universelle Liste von Plattformdefinitionen gibt, nach der Tatsache zu urteilen, dass jede Cross-Plattform-Bibliothek, die ich gesehen habe, eine Ad-hoc-Konfiguration hat. Aber Sie können an die, die durch ziemlich portable Bibliotheken wie libpng verwendet suchen betrachten, zlib usw.

Hier ist die eine, die von libpng

0

Die Definitionen werden bis zu Ihrem Compiler-Anbieter sein rein. Wenn Sie den gleichen Compiler (zB gcc) auf all Ihren Plattformen verwenden, werden Sie es etwas leichter haben.

Sie können auch versuchen, stattdessen Ihr Projekt so zu organisieren, dass die meisten .h-Dateien nicht plattformabhängig sind. Teilen Sie Ihre Implementierung (cpp-Dateien) in separate Dateien auf. eine für die unspezifischen Sachen und eine für jede Plattform. Die plattformspezifischen können "private" Header enthalten, die nur für diese Plattform sinnvoll sind. Möglicherweise müssen Sie Adapterfunktionen machen, damit so etwas 100% funktioniert (wenn die System-Bibliotheken leicht unterschiedliche Argumente annehmen), aber ich habe herausgefunden, dass es am Ende wirklich hilfreich ist, und es ist viel einfacher, eine neue Plattform zu erstellen in der Zukunft.

0

Wenn Sie durch die Standard Präprozessorsymbole für ein gegebenes System aussehen soll, auf dem Sie GCC haben (zB Mac OS X, iOS, Linux), können Sie eine vollständige Liste der Befehlszeile erhalten somit:

jedoch
echo 'main(){}' | cpp -dM 

Diese sind oft nur von begrenztem nutzen, wie in der Phase der Zusammenstellung, bei der der Prä-Prozessor arbeitet, die meisten Symbole identifizieren, das Betriebssystem und CPU-Typen nur aus dem System die Compiler-Hosting, anstatt dem System Ziel sein (zB beim Cross-Compiling für iOS). Unter Mac OS X und iOS, dem richtigen Weg, um die Kompilierung-Eigenschaften des Systems ins Visier ist

#include <TargetConditionals.h> 

Dies wird abholen TargetConditionals.h von der Plattform und SDK derzeit verwendet, um zu bestimmen, und dann können Sie Bestimmen Sie (z. B.) Endianness und einige andere Eigenschaften von einigen der Makros. (Sehen Sie sich TargetConditionals.h an, um zu sehen, welche Arten von Informationen Sie abrufen können.)

+0

Obwohl die Überprüfung der Ausgabe von -dM hilfreich sein kann, kann sie nicht so viele Informationen garantieren wie die Wiki-Seite der predef sourceforge. – rubenvb