2016-08-01 41 views
2

Sowohl C- als auch C++ - Standards geben nicht die genaue Länge einiger Datentypen an, sondern nur deren minimale Länge.Unterschiedliche Datentyplängen in Bibliotheken von Drittanbietern

Ich habe eine Drittanbieter-Bibliothek: someLib.lib (für meine Plattform kompiliert) und seine entsprechende someLib.h. Sagen wir, es enthält folgende Funktionen:

int getNumber(); 
void setNumber(int number); 

Wenn ich ein Programm raubend dieser Bibliothek zu kompilieren, prüft der Compiler die Typen mit den definierten Signaturen im someLib.h, so lange, wie ich int s verwenden, sollte alles kompilieren Fein .

Aber was passiert, wenn in meinem Compiler int ist länger oder kürzer als in dem Compiler, der verwendet wurde kompilieren someLib.lib? Wird es beim Linken erkannt? Wird es Laufzeitfehler verursachen? Kann ich das someLib.lib sicher benutzen, ohne zu wissen, wie es kompiliert wurde?

+0

Das ist fast nie ein Problem mit einfachen Typen wie "int". Wo diese Art von Problem auftritt, ist mit Strukturen, die unterschiedliche Auffüllung abhängig von Compiler-Unterschiede oder sogar nur verschiedene Optionen auf dem gleichen Compiler haben; oder mit Features, die implementierungsdefinierte Details wie Bitfelder haben. Das ist ein Grund dafür, undurchsichtige Schnittstellen zu haben, die solche Details vollständig in der Bibliothek enthalten. –

Antwort

3

Sie sollten nicht Compiler oder Linker Fehler, nur undefiniertes Verhalten zur Laufzeit. Möglicherweise Abstürze oder, wenn Sie Glück haben, nur seltsame Ergebnisse.

+3

Ich würde sagen, Sie haben Glück, wenn Sie Abstürze und Pech bekommen, wenn Sie nur seltsame Ergebnisse bekommen. – Jovasa

1

Die Verwendung einer Bibliothek mit engen Annahmen über das zugrunde liegende System oder den Compiler kann zu Problemen führen.

Also, wenn die Bibliothek, die Sie verwenden, angenommen hat, dass int 16 Bit ist, aber Sie es in einem 32-Bit-System verwenden, haben Sie Probleme in der Laufzeit.

Gute implementierte Bibliotheken haben #if Makros, um diese Probleme zu minimieren, oder sie haben verschiedene .lib Dateien für verschiedene Systeme implementiert. Sie könnten sogar intX_t (z. B. int32_t) Ganzzahlen explizit portabler machen.