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?
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). –
Was bedeutet "dasselbe System"? Gleiche Hardware? Gleiches Betriebssystem? Gleiche Compiler-Suite? Gleiche Systembibliotheken? –
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. –