2015-06-12 6 views
5

Ich habe in letzter Zeit begonnen, OpenCL-Bibliothek zu verwenden, und ich habe festgestellt, dass sie ihre eigenen Integer-Typen wie cl_int und cl_uint anstelle von int und unsigned int verwenden.Warum definieren C++ - Bibliotheken oft ihre eigenen primitiven Typen?

Warum ist das? Warum verwenden sie nicht die Typen, die standardmäßig in der Sprache sind? Ist es eine gute Übung oder gibt es praktische Gründe dafür (d. H. Besser lesbaren Code)?

+1

Meistens für x64/x86 Cross-Compliance, oder um bestimmte Bedingungen zu definieren. – Bastien

+0

https://en.wikipedia.org/wiki/Not_invented_here –

Antwort

8

Der Grund, warum dies in der Vergangenheit getan wurde, ist die Portabilität. C und C++ geben keine spezifischen Garantien für die Größe int, long und short, während Bibliotheksdesigner es oft benötigen.

Eine gängige Lösung besteht darin, ihre eigenen Aliase für Datentypen zu definieren und die Definitionen auf der Grundlage der spezifischen Plattform zu ändern, wobei sichergestellt werden muss, dass der Typ der entsprechenden Größe verwendet wird.

Dieses Problem entstand in C und wurde durch Einführung von stdint.h Header-Datei (umbenannt in cstdint in C++) angesprochen. Wenn Sie diesen Header einschließen, können Sie die Typen int32_t, int16_t usw. deklarieren. Bibliotheken, die vor der Einführung von stdint.h entwickelt wurden, und Bibliotheken, die zum Kompilieren auf Plattformen ohne diesen Header erforderlich sind, verwenden die alte Problemumgehung.

+0

Viel klarer jetzt, danke. Könnten Sie mich für ein bestimmtes Beispiel auf eine Site verweisen? Wie würden Sie Ihren eigenen Integer-Typ definieren, sagen wir unsigniert und 16 Bit lang? – Addy

+1

@Addy Dies geschieht normalerweise mit der bedingten Kompilierung '# ifdef' und' typedef's in einem der Header. Für OpenCL ist das [cl_platform.h] (https://www.khronos.org/registry/cl/api/1.1/cl_platform.h). Durchsuchen Sie die Datei nach 'cl_uint', um zu sehen, wie sie auf der Plattform definiert ist. – dasblinkenlight

3

Oft ist es so anders Konfigurationen können eingerichtet werden und im gesamten Code fortpflanzen.

Zum Beispiel weiß ich, dass Bullet 3 definiert btScalar, die (unter anderem) im Grunde ist:

#if defined(BT_USE_DOUBLE_PRECISION) 
typedef double btScalar; 
#else 
typedef float btScalar; 
#endif 

So im gesamten Code, den Sie btScalar statt float oder double, und alle Instanzen, dass verwenden könnte sein könnte umgestellt, indem Sie das Makro definieren oder nicht definieren.

Es gibt andere Analoga davon, die width of integer types, different character sets und andere plattformabhängige Szenarien behandeln.

3

Durch die Definition ihrer eigenen Typen können sie sich sicher darauf verlassen, dass diese Typen immer die gleiche Größe haben.

Typen können von Plattform zu Plattform und Compiler zu Compiler variieren. Obwohl die STL <cstdint> bietet, bevorzugen einige Entwickler ihre eigenen Definitionen, weil sie die STL nicht verwenden möchten.

Die meiste Zeit können Sie davon ausgehen, dass int 32 Bit groß ist, aber es kann sich ändern, und das ist der Punkt, an dem einige Entwickler lieber ihre eigenen zuverlässigen Typen definieren, je nachdem, was nicht der Fall ist.