Was ist der Unterschied zwischen static const und const?

Lesezeit: 4 Minuten

Benutzeravatar von Lior
Lior

Was ist der Unterschied zwischen static const und const? Zum Beispiel:

static const int a=5;
const int i=5;

Gibt es einen Unterschied zwischen ihnen? Wann würden Sie eines über dem anderen verwenden?

  • Siehe auch: stackoverflow.com/questions/6381088/const-vs-static-const

    – Halex

    1. November 2012 um 21:33 Uhr

  • Für die Wiedereröffnung gestimmt. Das “Duplikat” stellt eine ganz andere Frage, die sich speziell auf die Speichernutzung bezieht. Diese Frage stellt eine allgemeinere Frage zum Unterschied.

    – rmaddy

    5. März 2015 um 15:22 Uhr

  • Ich denke, Sie stellen diese Frage, wenn Sie die Bedeutung von nicht verstehen statisch. So, Dies Erklärung könnte hilfreich sein.

    – Scott

    9. September 2021 um 5:56 Uhr


Joes Benutzeravatar
Jo

static bestimmt die Sichtbarkeit außerhalb einer Funktion oder die Lebensdauer einer Variablen innerhalb. Es hat also nichts damit zu tun const an sich.

const bedeutet, dass Sie den Wert nach der Initialisierung nicht ändern.

static innerhalb einer Funktion bedeutet, dass die Variable vor und nach der Ausführung der Funktion existiert.

static außerhalb einer Funktion bedeutet, dass der Geltungsbereich des Symbols markiert ist static ist auf diese .c-Datei beschränkt und außerhalb davon nicht sichtbar.

Technisch (wenn Sie das nachschlagen möchten), static ist ein Speicherbezeichner und const ist ein Typqualifizierer.

Der Unterschied liegt in der Verknüpfung.

// At file scope
static const int a=5;  // internal linkage
const int i=5;         // external linkage

Wenn die i Objekt außerhalb der Übersetzungseinheit, in der es definiert ist, nicht verwendet wird, sollten Sie es mit deklarieren static Bezeichner.

Dies ermöglicht dem Compiler (möglicherweise) weitere Optimierungen durchzuführen und informiert den Leser darüber, dass das Objekt nicht außerhalb seiner Übersetzungseinheit verwendet wird.

  • +1 Es wäre großartig, wenn Sie auch hinzufügen könnten, was es bedeutet, wenn sich diese Deklarationen innerhalb einer Funktion befinden.

    – Prätorianer

    1. November 2012 um 21:49 Uhr

  • Sind Sie sicher, dass const int i = 5; hat eine externe Verlinkung?? In C++ geht das nicht…

    – Kerrek SB

    1. November 2012 um 21:55 Uhr


  • @KerrekSB im Dateibereich, ja. (C99, 6.2.2p5) “Wenn die Deklaration eines Bezeichners für ein Objekt einen Dateibereich und keinen Speicherklassenbezeichner hat, ist seine Verknüpfung extern.”

    – au

    1. November 2012 um 21:58 Uhr

  • @KerrekSB: C und C++ sind nicht dieselbe Sprache. Insbesondere C const hat nichts mit C++ zu tun const.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    1. November 2012 um 22:46 Uhr

  • Optimieren Compiler wirklich basierend auf Statik? Anscheinend ist es nicht sicher anzunehmen, dass ein statisches Objekt nicht außerhalb seiner Übersetzungseinheit verwendet wird, da es immer noch von einer nicht statischen Funktion weitergegeben oder von einem nicht statischen globalen Zeiger darauf gezeigt werden kann.

    – nw.

    14. Januar 2019 um 22:43 Uhr

Es hängt davon ab, ob diese Definitionen innerhalb einer Funktion sind oder nicht. Die Antwort für den Fall außen eine Funktion ist oben durch ouah gegeben. Innen einer Funktion ist die Wirkung anders, wie das folgende Beispiel zeigt:

#include <stdlib.h>

void my_function() {
  const int foo = rand();         // Perfectly OK!
  static const int bar = rand();  // Compile time error.
}

Wenn Sie möchten, dass eine lokale Variable “wirklich konstant” ist, müssen Sie sie nicht nur “const”, sondern “static const” definieren.

  • Es kompiliert perfekt für mich … Aber ich weiß, dass es dumm ist, in diesem Fall eine statische konstante Variable zu haben.

    – jaques-sam

    6. Februar 2018 um 12:27 Uhr

  • @DrumM es ist nicht dumm. Im Falle des foo die Variable wird jedes Mal neu initialisiert my_function() aufgerufen, wodurch ein anderer Zufallswert zugewiesen wird. Im Falle des bar die Variable wird nur einmal initialisiert, das erste Mal my_function() aufgerufen, was dazu führt, dass für die gesamte Lebensdauer des Programms derselbe Wert zugewiesen wird. Daher statische Speicherdauer.

    – jb

    12. Juni 2019 um 10:12 Uhr

  • Tatsächlich hängt es bei weiterer Überlegung davon ab, ob wir C oder C++ verwenden. Die Frage ist mit C gekennzeichnet, in diesem Fall erhalten wir einen Kompilierungsfehler für die Zuweisung von bar wegen rand() keine Kompilierzeitkonstante sein.

    – jb

    12. Juni 2019 um 10:20 Uhr

  • @nibot können Sie klarstellen, was Sie mit “der Effekt ist unterschiedlich” und “wirklich konstant” in Bezug auf die Speicherspezifikation und die Typqualifizierung meinen?

    – jb

    12. Juni 2019 um 10:22 Uhr

Tobins Benutzeravatar
Tobin

const int i=5;  

i Wert, den Sie ändern können, indem Sie einen Zeiger verwenden, wenn i wird lokal definiert und deklariert, falls dies der Fall ist static const int a=5; oder const int i=5; global , können Sie nicht ändern, da es im RO-Speicher im Datensegment gespeichert ist.

    #include <stdio.h>
   //const int  a=10;              /* can not modify */
   int main(void) {
   // your code goes here

   //static const int const a=10;   /* can not modify */
   const int  a=10; 
   int *const ptr=&a;
   *ptr=18;
   printf("The val a is %d",a);
   return 0;
} 

1421230cookie-checkWas ist der Unterschied zwischen static const und const?

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

Privacy policy