Ich möchte ein konstantes statisches Array erstellen, das in meiner Objective-C-Implementierungsdatei verwendet wird, ähnlich wie auf der obersten Ebene meiner ".m" -Datei:
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
Ich habe vor, es NUM_TYPES
später in der Datei zu verwenden, also wollte ich es in eine Variable einfügen.
Wenn ich dies tue, erhalte ich jedoch den Fehler
"Variabel geänderte 'Typen' im Dateibereich"
Ich habe festgestellt, dass dies möglicherweise damit zu tun hat, dass die Arraygröße eine Variable ist (ich erhalte diese Meldung nicht, wenn ich dort ein ganzzahliges Literal eingebe, wie z static int types[4]
. B. ).
Ich möchte das beheben, aber vielleicht mache ich alles falsch ... Ich habe hier zwei Ziele:
- Um ein Array zu haben, auf das in der gesamten Datei zugegriffen werden kann
- In
NUM_TYPES
eine Variable einkapseln , damit nicht dasselbe Literal über verschiedene Stellen in meiner Datei verteilt ist
Irgendwelche Vorschläge?
[BEARBEITEN] Gefunden in der C-FAQ: http://c-faq.com/ansi/constasconst.html
#define kNUM_TYPES 4
?@"An NSString literal"
). Das einzige, was an Ihrem Code falsch ist, ist, dass das Semikolon nicht benötigt wird.Antworten:
Der Grund für diese Warnung ist, dass const in c nicht konstant bedeutet. Es bedeutet "schreibgeschützt". Der Wert wird also an einer Speicheradresse gespeichert und kann möglicherweise durch Maschinencode geändert werden.
quelle
const
(z. B. durch Wegwerfenconst
von einem Zeiger und Speichern eines Werts) ist ein undefiniertes Verhalten. Daher ist der Wert eines solchen Objekts eine Kompilierungs- oder Laufzeitkonstante (abhängig von der Speicherdauer). Der Wert kann nicht in einem konstanten Ausdruck verwendet werden, nur weil der C-Standard dies nicht sagt. (Das Wegwerfenconst
und Speichern eines Werts ist zulässig, wenn das Zielobjekt ohne definiertconst
oder dynamisch zugewiesen ist. Zeichenfolgenliterale werden nicht geschriebenconst
, können aber nicht beschrieben werden.)extern
Konstanten in verschiedenen TUs geben, deren Wert beim Kompilieren der aktuellen TU nicht bekannt ist.Wenn Sie den Präprozessor gemäß den anderen Antworten trotzdem verwenden
NUM_TYPES
möchten, können Sie den Compiler veranlassen, den Wert von automatisch zu bestimmen:quelle
sizeof
solcher Objekte ist eine Konstante zur Kompilierungszeit.quelle
Es ist auch möglich, die Aufzählung zu verwenden.
quelle
Wie bereits in anderen Antworten erläutert,
const
bedeutet C in C lediglich, dass eine Variable schreibgeschützt ist. Es ist immer noch ein Laufzeitwert. Sie können jedoch eineenum
als echte Konstante in C verwenden:quelle
Imho ist dies ein Fehler in vielen C-Compilern. Ich weiß, dass die Compiler, mit denen ich gearbeitet habe, keine "statische const" -Variable an einer Adresse speichern, sondern die Verwendung im Code durch die sehr konstante ersetzen. Dies kann überprüft werden, da Sie dieselbe Prüfsumme für den erzeugten Code erhalten, wenn Sie eine Präprozessor-Direktive #define verwenden und wenn Sie eine statische const-Variable verwenden.
In beiden Fällen sollten Sie nach Möglichkeit statische const-Variablen anstelle von #defines verwenden, da die statische const typsicher ist.
quelle
static const
Variablen übernehmen können. Das Verhalten, das Sie beschreiben, ist möglicherweise eine gültige Optimierung, aber es kann sicherlich nicht immer funktionieren.