C vs. C++ sizeof [duplicate]

Lesezeit: 2 Minuten

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 impliziert CHAR_BIT >= 16).

    – Keith Thompson

    7. Januar 2016 um 20:21 Uhr

  • Das richtige Format zum Drucken a size_t Wert (z. B. das Ergebnis von sizeof) 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

In C ist eine Strukturdefinition wie struct x { int a; int b; }; definiert keinen Typ xes definiert einen Typ struct x. Wenn Sie also die entfernen int x; global finden Sie, dass die C-Version nicht kompiliert wird.

  • Mein Gehirn hat die globale Erklärung von völlig beschönigt x.

    – Benutzer1717828

    8. Januar 2016 um 0:08 Uhr

1383740cookie-checkC vs. C++ sizeof [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy