Ich habe mit GCC experimentiert und festgestellt, dass Sie externe Variablen const
in Header-Dateien deklarieren können, sie aber in Implementierungsdateien veränderbar halten.Deklaration einer globalen Variable `extern const int` im Header aber nur` int` in der Quelldatei
BEARBEITEN: Das funktioniert eigentlich nicht. Der einzige Grund, warum ich meinen Testcode kompilieren ließ, war, dass ich "header.h" nicht in "header.c" eingefügt habe.
header.h:
#ifndef HEADER_H_
#define HEADER_H_
extern const int global_variable;
#endif
header.c:
int global_variable = 17;
Dies scheint ein sehr gutes Feature für die Verwendung global_variable
nur lesbar für die Nutzer von header.h
zu halten, aber sie modifable durch die Beibehaltung Implementierung (header.c
).
HINWEIS: Der folgende Code ist nur ein Beispiel dafür, wie diese Art der Deklaration die Zuweisung an global_variable
verhindert.
#include "header.h"
int main(void)
{
global_variable = 34; /* This is an error as `global_variable` is declared const */
return 0;
}
Weil ich noch nie Technik in der Praxis gesehen. Ich frage mich, ob es gültig ist.
Ist das wohl definiertes Verhalten oder ist das ein Fehler, vor dem GCC mich nicht warnen kann?
Was ist der genaue Wortlaut des Fehlers (kopieren und einfügen)? –
Ich würde es verwirrend finden, dass sich eine const-Variable überhaupt ändern könnte. Ich würde den Bereich mit statisch beschränken und eine Funktion bereitstellen, um den aktuellen globalen Wert zurückzugeben, um denselben Effekt zu erzielen. – ryanpattison
Das funktioniert nur, wenn header.h in header.c ** nicht ** enthalten ist. Wenn man header.h in header.c einfügt, führt die Zuweisung ** zu einem Syntaxfehler. Wenn das in einem echten Programm mit 1000 Zeilen Code gemacht wird und etwas damit nicht stimmt - wie leicht wird es repariert werden? –