Zweck dieses Codierungsstils

Ich bin auf dieses Stück Code für einen LPCxxxx-Mikrocontroller in der Reset-Routine gestoßen.

do {
    const uint32_t topOfStack = (uint32_t) &_vStackTop;
    __set_PSP(topOfStack);
    __set_MSP(topOfStack);
} while(0);

Ich habe mich gefragt, warum sich dies in einer Do-while-Schleife befindet (die nur einmal ausgeführt wird), anstatt diese Anweisungen direkt zu schreiben (womit ich außerhalb der Schleife meine).

Es gibt eine Antwort auf diese Praxis bei stackoverflow: stackoverflow.com/questions/257418/…

Antworten (1)

In diesem speziellen Fall, der nicht in den Stackoverflow-Antworten behandelt wird, haben Sie die Möglichkeit, eine lokale Variable zu deklarieren, die von den drei Anweisungen gemeinsam genutzt und nirgendwo anders verwendet wird.

Diese Art der expliziten Speicheroptimierung kann auf kleinen Mikrocontrollern wichtig sein.

Die geschweiften Klammern allein würden das tun, ohne die dound die while(0);.
@PeteBecker: waren diese auch in frühen C-Dialekten verfügbar?
@PlasmaHH - Ich habe nicht nachgesehen, aber soweit ich weiß, war C immer blockbezogen.
Vor den Wundern von ANSI C war es implementierungsabhängig, ob der Blockbereich dies erreichen würde. Ich meine mich zu erinnern, dass das sehr frühe Lattice C dies nicht tat - es beförderte die Variable in den Funktionsumfang.
Beachten Sie, dass ich der Ablehnung widersprochen habe, da diese Methode die Anforderung (wie von Dave Tweed angegeben) garantiert erfüllt, selbst wenn der Compiler möglicherweise nicht ANSI-kompatibel ist (der Stand der Dinge seit vielen Jahren).
Viel Glück bei der Suche nach einem Pre-ANSI-Compiler, der uint32_t. Ich bin mir ziemlich sicher, dass das do-while(0) überflüssig und {}ausreichend ist, auf jedem bekannten Compiler der Welt. Wenn Ihr Compiler kein alter Schrott ist, brauchen Sie die geschweiften Klammern natürlich überhaupt nicht. Überspringe sie und ermutige/erzwinge dadurch Leute, Compiler zu verwenden, die nicht älter als 17 Jahre sind (nach dem Jahr 1999).