Ich habe eine Open-Source-Codebasis, die sowohl in C als auch in C++ geschrieben ist. Ich suche nach einem Integer-Typ, der garantiert ist wenigstens 64 Bit breit, die auf den meisten OS X- (Intel, 64-Bit) und Linux-Boxen mit Open-Source-C- und C++-Compilern zuverlässig kompiliert werden können, ohne zu viel zusätzliche Arbeit auf Seiten des Endbenutzers. Die Unterstützung von Windows und 32-Bit-Clients ist derzeit nicht wichtig.
Ich habe einige Tests unter OS X durchgeführt, und der neueste GCC, der mit den Entwicklertools geliefert wird, unterstützt den C+11-Modus nicht (und scheint daher die Verfügbarkeit von long long
). Clang unterstützt dies auch nicht, obwohl es unterstützt long long
wenn der C99-Modus aktiviert ist, ab einer bestimmten Version.
Ist der allgemeine Vorschlag zu verwenden int64_t
anstelle von long long
, wenn Portabilität ein wichtiges Ziel ist? Die Verwendung der Formatbezeichner scheint schmerzhaft.
Kann ich zuverlässig an int64_t
zu long long
(und ebenso an die unsigned
gleichwertig mit uint64_t
), um es mit vorhandenen Funktionen und Bibliotheken zu verwenden, die dauern long long
als Parameter? (Und natürlich wieder zurück.)
Wenn ich Code versende, der Clang-Funktionalität erfordert, die nicht in GCC enthalten ist, wird Clang GCC als Compiler der Wahl unter Linux ersetzen? Kann ich diesen Compiler größtenteils erwarten, wenn ich Endbenutzern Quellcode anbiete?
Grundsätzlich möchte ich andere Entwickler um Rat fragen, die beide Typen für portierbaren C- und C++-Code verwendet haben und vielleicht einige Vorschläge haben, was angesichts des oben genannten Ziels langfristig der bessere Weg sein könnte .
gcc hatte
long long
als Erweiterung vor c ++ 11, so lange Sie gcc-extensions nicht deaktivieren, sollten Sie mit der Verwendung zufrieden seinlong long
auf gcc (Eigentlich glaube ich nicht, dass ich einen Compiler verwendet/gesehen habe, der lange Zeit nicht lange angeboten hat).– Grizzly
17. September 2012 um 23:09 Uhr
Beachten Sie, dass
int64_t
kann einen zugrunde liegenden Typ habenlong
oderlong long
Dies kann unter anderem zu Portabilitätsproblemen führen, wenn eine Überladung erforderlich ist.– Markus B
17. September 2012 um 23:41 Uhr
Ziehen Sie auch typedef in Betracht, um einfache Änderungen von Plattform zu Plattform vorzunehmen.
– imallett
18. September 2012 um 5:48 Uhr
Eine zu berücksichtigende Sache ist die Verwendung von Überladungen oder Vorlagen mit
int64_t
möglicherweise verschiedene Versionen auf verschiedenen Systemen auswählen. Siehe diese andere Frage zu int64_t vs. long vs. long long– Bo Persson
18. September 2012 um 9:00 Uhr