2014-01-29 12 views
5

Eine sehr einfache Frage: Gibt es irgendwelche Garantien, dass ein C int ist das gleiche wie ein C++ int, auf dem gleichen System?Interoperabilität der Typen in C und C++

Das ist natürlich eine rein theoretische Frage.

Die C- und C++ - Standards verwenden dieselbe Sprache, um die grundlegenden Typen zu definieren. Aber während Fortran 2003 macht deutlich, dass

use ISO_C_BINDING 
integer(kind=c_int) :: i 

einen Integer-Typ deklariert, die mit dem int Typ auf einem „Begleiter C Prozessor“ kompatibel ist, kann ich nicht eine solche Behauptung in der C++ stardard. Es erscheint sehr merkwürdig, dass Fortran stärkere C-Interoperabilitätsgarantien als C++ bietet!

Die nächstgelegene ich finden kann, ist Abschnitt 7.5 [dcl.link] Absatz 3 des C++ 11-Standard, der besagt, dass

Jede Implementierung zur Verknüpfung mit Funktionen geschrieben in der Programmiersprache C zur Verfügung stellen soll Sprache

Aber dieser kleine Satz scheint mir nicht stark genug, um die Kompatibilität der grundlegenden Typen zu garantieren.

Gibt es eine andere Sprache im C++ - Standard, die ich übersehen habe, die dies garantiert, oder ist es nur so selbstverständlich, dass niemand es explizit angegeben hat?

BEARBEITEN: David Schwartz in den Kommentaren weist darauf hin, dass ich ungenau war, als ich "das gleiche System" sagte. Ich meinte wirklich die gleiche "Plattform", d. H. Hardware, Betriebssystem, Systembibliotheken usw. Es ist wirklich ein ABI-Problem natürlich. In der zitierten Passage scheint der C++ - Standard darauf hinweisen zu wollen, dass Sie C-Funktionen mit extern "C" aufrufen können, aber ich bin mir nicht sicher, ob es genug andere Garantien bietet?

+1

Ich würde * auf dem gleichen System * auf * auf dem gleichen System mit dem gleichen Compiler und Compiler-Einstellungen * erweitern. Andernfalls ist die Antwort definitiv nein (Sie können eine i386-Binärdatei mit 32-Bit-Int auf einem 64-Bit-System kompilieren). –

+0

Was bedeutet "dasselbe System"? Gleiche Hardware? Gleiches Betriebssystem? Gleiche Compiler-Suite? Gleiche Systembibliotheken? –

+2

Vielleicht 3.9.1p3 'Die vorzeichenbehafteten und vorzeichenlosen Integer Typen müssen die in der C-Norm, Abschnitt 5.2.4.2.1, angegebenen Bedingungen erfüllen. –

Antwort

5

Nr

Es ist weit verbreitet Compiler auf x64 AMD kompatibler CPU- konform, die long als 32-Bit und andere als 64-Bit standardmäßig behandeln. Dies ist nicht einmal der Fall für zwei C++ - Compiler auf demselben System, geschweige denn einen C++ - und C-Compiler.

Innerhalb eines Compilers, das ist der Compiler-Anbieter, wenn sie kompatibel sind. Sie sind normalerweise (immer). "Ein Compiler" ist hier ein bisschen irreführend: Die C und C++ - Compiler sind verschiedene Compiler, selbst wenn sie im selben Binärcode vom selben Anbieter sind.

+0

Die Antwort ist richtig. Die C- und C++ - Standards verwenden eine ähnliche Sprache und garantieren eindeutig nicht, dass ganze Zahlen eine bestimmte Größe haben. Ich glaube nicht, dass der Fortran-Compiler aus ähnlichen Gründen sein Versprechen halten kann. –