Ich bin gerade auf dieses einfache Code-Snippet gestoßen und frage mich, warum die Ausgabe dieses Programms erfolgt, wenn es von einem C-Compiler kompiliert wird 4
und wenn es von einem C++ kompiliert wird, ist es 8
.
#include <stdio.h>
int x;
int main(){
struct x {int a; int b;};
printf("%d", sizeof(x));
return 0;
}
Die C++-Ausgabe ist rational (8 = 4 + 4 = sizeof(x.a) + sizeof(x.b)
), aber die Ausgabe von C nicht. Also, wie funktioniert sizeof
in C arbeiten?
Anscheinend bevorzugt C globale Variablen gegenüber lokalen. Ist es richtig?
So viel ich mich in C erinnern kann, können Sie nicht auslassen
struct
es sei denn, Sie geben es ein– Slava
7. Januar 2016 um 19:19 Uhr
Dies ist ein bekannter Trick für die Interviewfrage „Wie würden Sie ein Programm schreiben, das je nach Compiler C oder C++ ausgibt, ohne dass ein Präprozessormakro verwendet wird?“
– SergejA
7. Januar 2016 um 19:26 Uhr
@SergeyA Viel einfacher, check
sizeof('a')
.– edmz
7. Januar 2016 um 20:17 Uhr
@black: Das unterscheidet nicht zwischen C++ und einer C-Implementierung mit
sizeof (int) == 1
(was impliziertCHAR_BIT >= 16
).– Keith Thompson
7. Januar 2016 um 20:21 Uhr
Das richtige Format zum Drucken a
size_t
Wert (z. B. das Ergebnis vonsizeof
) ist"%zu"
nicht"%d"
. Oder, wenn Sie mit einer alten Implementierung stecken bleiben, die dies nicht unterstützt:printf("%d\n", (int)sizeof(x));
. (Das\n
ist sehr zu empfehlen; Wenn am Ende eines Textstroms kein Zeilenumbruch gedruckt wird, kann dies zu undefiniertem Verhalten führen.)– Keith Thompson
7. Januar 2016 um 20:31 Uhr