6 Stimmen

Unterschied zwischen flüchtig und __flüchtig__

Was ist der Unterschied zwischen volatile y __volatile__ in mit gcc kompiliertem C-Code?

Ich habe mir den Linux-Quellcode angesehen und festgestellt, dass an einigen Stellen die __asm__ __volatile__ andere verwenden asm volatile und andere verwenden __asm__ volatile .

Ich habe nicht gesehen __volatile__ verwendet ohne __asm__ , während ich gesehen habe volatile an einer Vielzahl anderer Stellen verwendet.

Gibt es einen Unterschied zwischen dem, was __volatile__ y volatile tun? Wenn ja, was ist es? Oder wenn nicht, gibt es einen Grund dafür, dass __volatile__ manchmal verwendet wird?

10voto

Paul R Punkte 201623

Dies dient lediglich der Abwärtskompatibilität mit altem Code. Schlüsselwörter, die später zu C hinzugefügt wurden, wie z.B. inline , volatile , asm usw. haben Unterstrich-Präfix/Suffix-Versionen ( __inline__ , __asm__ , __volatile__ usw.), so dass Sie sie in altem Code verwenden können, der bereits die ungeschmückten Namen als Typen/Funktionen/Variablen/was auch immer verwendet. Es gibt einen Befehlszeilenschalter, der dies steuert, -ansi - wenn Sie kompilieren mit gcc -ansi ... werden nur die Unterstrichversionen dieser neueren Schlüsselwörter erkannt.

4voto

DigitalRoss Punkte 138823

Wegen der -ansi

Obwohl eine echte -ansi Programm nicht verwenden würde asm(), es muss eine Möglichkeit geben, ein asm-Makro in einen Header einzubinden, auch wenn das Programm selbst mit -ansi . (Mit -ansi gcc enthält keine Erweiterungen, die mit dem strengen ISO C in Konflikt stehen, wie z.B. neue Schlüsselwörter).

Eine Alternative mit korrektem Namensraum __asm__ war notwendig für asm die vom System nicht definiert werden konnten, in -ansi Modus. Dies war nicht unbedingt notwendig bei volatile, das seit langem ein Schlüsselwort ist, aber vielleicht hat jemand aus Trägheit auch (und unnötigerweise) ein __volatile__ (reserviertes Systemnamensformat) zu ergänzen mit volatile auch wenn das Programm legal gewesen wäre -ansi so oder so.

3voto

gustaf r Punkte 1194

Ergänzend zur Antwort von Paul R;

Vorausgesetzt, Sie haben keinen der folgenden Namen definiert:

  • asm y volatile son Sprache Schlüsselwörter. Woher wissen Sie das? Sie haben keinen Unterstrich vor oder nach ihnen, daher sind sie Schlüsselwörter in der Sprache .

  • _something_ (ein Unterstrich) ist ein reservierter Compiler Schlüsselwort, Typ, Makro, usw.

  • __asm__ , __volatile__ y __whatever_else__ (zwei Unterstriche) sind Standardbibliothek Schlüsselwörter, Makros, etc.

Wenn Sie dies wissen, können Sie herausfinden, was die Dinge in Zukunft bedeuten, was Sie googeln müssen und wo Sie die entsprechenden Hinweise finden.

0voto

Jingguo Yao Punkte 6278

__asm__ ist eine Alternative zu asm. Sie bedeuten das Gleiche. Ich kann die entsprechenden Informationen in der GCC-Dokumentation finden.

Für flüchtig und __flüchtig, 1 y 2 sagen, dass es bedeutet "Wenn Ihre Assembler-Anweisung muss ausgeführt werden, wo Sie es setzen". Aber ich durchsuche die GCC-Dokumente 3 und findet eine solche Erklärung nicht. Ich weiß auch nicht, welche Antwort richtig ist: die Antwort, die in 2 oder die Antwort von Paul R.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X