define und array
-
Hy leute
Ich habe mal ein C-Problem:typedef unsigned char bool; #define SCREEN_WIDTH = 500; #define SCREEN_HEIGHT = 500; bool field[SCREEN_WIDTH][SCREEN_HEIGHT];
typedef unsigned char bool; bool field[500][500];
Der untere Code wird ohne probleme kompiliert.
Beim oberen erhalte ich aber folgende Fehlermeldungen:error: expected expression before ‘=’ token error: expected identifier or ‘(’ before ‘]’ token
Wieso geht das nicht und wie loese ich das?
-
// entweder #define SCREEN_WIDTH 500 #define SCREEN_HEIGHT 500 // besser const int ScreenWidth = 500; const int ScreenHeight= 500;
-
*facepalm* alles klar^^
wieso ist const int besser als define?
-
Achso, die Erklärung ist, dass vor dem Compiler der Makroprozessor eine Textersetzung durchführt.
Alle Textvorkommen von SCREEN_WIDTH werden durch "500", bei deinem Code jedoch durch "= 500;" ersetzt.
Alsobool field[= 500;][= 500;];
Wenn man nicht gute Gründe hat (Include-Guards etc), sollte man daher, zumindest am Anfang, weitestgehend auf Präprozessor-Direktiven verzichten.
-
ach so ich verstehe
danke fuer die schnelle und gute hilfe
-
Den zweiten Post hatte ich zu schnell abgesetzt.
Warum const int statt define? Der Makroprozessor führt wie geschrieben eine reine Textersetzung durch, zu mehr ist er nicht in der Lage.
Wenn du statt des defines direkt const int verwendet hättest, bspw. soconst int ScreenWidth = 500 // Semikolon fehlt
hätte der Compiler einen Fehler direkt bei der Definition von ScreenWidth gemeldet. Bei dem define meldet er den Fehler, wie du gemerkt hast, nicht bei dessen Definition, sondern erst bei dessen Verwendung.
Generell sind Makros auch nicht nur böse, sie sind in einigen Fällen sehr nützlich und im Falle von Include-Guards fast unabdingbar, doch am Anfang hat man wahrscheinlich genug andere Probleme, als sich auch noch mit ihnen herumschlagen zu müssen.
-
Auf const - Konstanten als Angabe für Array-Dimensionen antwortet
zumindest mein C-Compiler (nicht ganz zu Unrecht) mit einem Übersetzungsfehler.
const-Konstanten sind nicht automatisch Immediate-Werte, aber nur letztere
dürfen zwischen den Klammern stehen.
#define-Konstanten sind hingegen in jedem Fall erlaubt.
-
Das ist so nicht ganz korrekt. Die 1999 eingeführte Revision des C-Standards (C99) erlaubt die Angabe von Array-Breiten sogar durch Variablen und nennt diese dann variable length arrays bzw. VLAs. Sie macht dann allerdings keinen Unterschied zwischen int const und int, obwohl ein optimierender Compiler dazu natürlich in der Lage sein kann.
Jetzt ist es leider so, dass C99 noch nicht von allen gängigen C-Compilern unterstützt wird - insbesondere MSVC tanzt hier aus der Reihe - aber auch der beherrscht VLAs, von daher kann man sie in der Praxis überall problemlos einsetzen. In der Tat beherrschten die meisten C-Compiler dieses Feature schon vor 1999, was einer der Gründe für dessen Aufnahme in den Standard gewesen sein dürfte.
Wenn dein C-Compiler darauf mit einem Übersetzungsfehler reagiert, ist er entweder erstaunlich alt, oder du hast ihm C99 explizit verboten. Mal wild geraten: Wenn du gcc mit -ansi benutzt, ersetz -ansi durch -std=c99.