Arrayinitialisierung nur per define möglich
-
Wähl einfach den C99-Modus. Einfach
-std=c99
als Flag übergeben.
-
Btw. spricht in diesem Fall (array length) NIX gegen die Benutzung von #define.
[...] wäre mir neu [...] ist mir nicht bekannt [...]
Dann bist du wohl falsch informiert. Ich kann dirs nur sagen wie es ist, er macht es anstandslos.
-
dust schrieb:
Btw. spricht in diesem Fall (array length) NIX gegen die Benutzung von #define.
Aber natürlich. Hier treffen immer noch die gleichen Argumente gegen #define zu!
-
Aber natürlich. Hier treffen immer noch die gleichen Argumente gegen #define zu!
Im Gegenteil! (genauso keine Argumente liefernd)
Warum meinst du ist #define hier nachteilig?
-
Wie ich bereits sagte, treffen hier immer noch die gleichen Argumente zu. zB das man den Namensraum damit verschmutzt; dass der Compiler die Konstante nicht kennt, sondern nur der Preprozessor etc.
Warum meinst du, dass #define in diesem Fall und in anderen Fällen nicht in Ordnung sei?
-
rüdiger schrieb:
...das man den Namensraum damit verschmutzt;
huh??
rüdiger schrieb:
dass der Compiler die Konstante nicht kennt, sondern nur der Preprozessor
das erst trägt dazu bei, dass es eine 'richtige' konstante ist.
-
Warum meinst du, dass #define in diesem Fall und in anderen Fällen nicht in Ordnung sei?
Du meinst sicher "in Ordnung sei". Ich bin ja für die Nutzung von #define in diesem Fall.
Weil:
- kein unnötiger Speicherplatz in Anspruch genommen wird, denn eine Konstante wird ja irgendwo abgelegt, bei #define ist das nicht der Fall
- Namensraum verschmutzen? WTF?
- der Compiler muss die Konstante nicht kennen (wozu soll das gut sein, es geht hier um eine simple Zahl aus N+, glaube kaum, dass der Programmierer auf die Idee kommt da was anderes zu setzen)
-
dust schrieb:
- kein unnötiger Speicherplatz in Anspruch genommen wird, denn eine Konstante wird ja irgendwo abgelegt, bei #define ist das nicht der Fall
das ist falsch
edit: ok, in diesem beispiel ja. aber nicht allgemeingültig
-
ich sag ja: in DIESEM Fall spricht nix gegen #define ... sonst gibts da natürlich die Nachteile, die man in jedem Buch nachlesen kann.
Glaub das machen viele auch in der PRAXIS so, die array length mit #define festzulegen.
-
int main() { const unsigned int SIZE = 5; char string[SIZE] = "Test"; return 0; }
Das ist zulässig in C++ und dort vorzuziehen. In C darf ein Implementation diesen Code akzeptieren, muss aber nicht.
Sowohl in C als auch in C++ muss der Ausdruck, der die Größe des Arrays bestimmt ein konstanter integraler Ausdruck sein. Ein solcher Ausdruck setzt sich in C zusammen aus Integer- (Zeichen-, Aufzählungskonstanten,sizeof-Ausdrücken), die Operanden von Operatoren sein dürfen, wenn das Ergebnis integer Typ hat; Gleitkommakonstanten sind als Operanden von Casts zulässig. Der Begriff Integerkonstante in C entspricht dem des Integerliterals in C++. In C++ darf ein konstanter Integerausdruck zusätzlich konstante Variablen (und konstante statische Member) enthalten, wenn diese mit konstanten Ausdrücken initialisiert wurden - so wie hier. In C besteht diese Möglichkeit nicht, allerdings erlaubt C es einer Implementation Ausdrücke, die nach obiger Regel in C nicht konstant sind, als konstant anzusehen.Übrigens dürfte es wohl besser sein, 5 durch einen entsprechenden sizeof-Ausdruck zu ersetzen. So kann man elegant Zeichenketten als globale Variablen (extern linkage) mit vollständigem Typ deklarieren.
Header:#ifndef STRING_DEF #define STRING_DEF( name, value ) extern const char name[ sizeof value ] #endif STRING_DEF( string1, "foo" ); STRING_DEF( string2, "bar" );
Eine ÜE, die für die Definition benutzt wird:
#define STRING_DEF( name, value ) extern const char name[ sizeof value ] = value #include "header"
-
dust schrieb:
- kein unnötiger Speicherplatz in Anspruch genommen wird, denn eine Konstante wird ja irgendwo abgelegt, bei #define ist das nicht der Fall
Die konstante muss nicht gespeichert werden.
dust schrieb:
- Namensraum verschmutzen? WTF?
#define N 5 // ganz viel Code oder in Headern versteckt ... #define N 7 // oder int N = 2;
das ist doch das Grundproblem von #define
dust schrieb:
- der Compiler muss die Konstante nicht kennen (wozu soll das gut sein, es geht hier um eine simple Zahl aus N+, glaube kaum, dass der Programmierer auf die Idee kommt da was anderes zu setzen)
Er muss sie nicht kennen, kann aber bessere Fehlermeldungen generieren, wenn er sie kennt.
Ich sehe bei diesem Fall keinen Unterschied zu anderen Fällen. Was soll diesen Fall also besonders machen?
-
Man kann ein Array auch mit nem enum initialisieren.
enum { N = 100 }; char arr [N];
-
Big Brother schrieb:
Man kann ein Array auch mit nem enum initialisieren.
enum { N = 100 }; char arr [N];
Die Variante benutze ich in der Regel. Bin irgend wie nur nicht drauf gekommen sie hier zu erwähnen :).
-
Big Brother schrieb:
Man kann ein Array auch mit nem enum initialisieren.
enum { N = 100 }; char arr [N];
Eine Arrayinitialisierung ist das allerdings nicht.
-
rüdiger schrieb:
das ist doch das Grundproblem von #define
kennste #undef?
-
camper schrieb:
Big Brother schrieb:
Man kann ein Array auch mit nem enum initialisieren.
enum { N = 100 }; char arr [N];
Eine Arrayinitialisierung ist das allerdings nicht.
Wieso nicht. Steht dann nix drin in den Arrayelementen?
-
-std=c99 als Flag übergeben
Kennt der GCC leider nicht.
Jedoch werden mit const sehr wohl "echte" Konstanten erzeugt,
nur mit glück, wenn sie in einen speicherbereich kommen, der physikalisch schreibgeschützt ist.
Kannst du das vllt. mal ein bisschen ausführen?
Der Begriff Integerkonstante in C entspricht dem des Integerliterals in C++.
Heißt das, "5" ist nach der C-Definition konstant, "const int n=5;" dagegen nicht (bzw. es ist die Entscheidung des Compilers)?
@camper: Danke für den Code. Sieht praktisch aus.Wieso nicht. Steht dann nix drin in den Arrayelementen?
Weils nur ne Deklaration ist. Du kannst sie aber erweitern mit "char arr[N] = {0};".
-
moagnus schrieb:
-std=c99 als Flag übergeben
Kennt der GCC leider nicht.
Ich bin entsetzt. Fängt die Versionsnummer noch mit 2 an?!?
Der Begriff Integerkonstante in C entspricht dem des Integerliterals in C++.
Heißt das, "5" ist nach der C-Definition konstant, "const int n=5;" dagegen nicht (bzw. es ist die Entscheidung des Compilers)?
Nicht konstant ist n im Sinne von "Konstant zur Kompilierungszeit".
-
moagnus schrieb:
Jedoch werden mit const sehr wohl "echte" Konstanten erzeugt,
nur mit glück, wenn sie in einen speicherbereich kommen, der physikalisch schreibgeschützt ist.
Kannst du das vllt. mal ein bisschen ausführen?
auf einem microcontroller z.b. landen const-objekte z.b. oft im flash. das ist ein speicher, der zwar einfach gelesen, aber nicht 'auf normalem' wege beschrieben werden kann. schreibzugriffe haben dort entweder gar keine wirkung, oder lösen eine exception aus.
übrigens sind solche 'gespeicherten' konstanten nur als array, structs oder funktionen interessant. einzelne, konstante integers, chars, etc. irgendwo gespeichert zu haben, hat selten einen vorteil. oft ist ein schlichtes #define nützlicher.
-
Amen! ^^