Problem mit define
-
Hallo zusammen,
ich weiß gerade nicht, ob ich einfach alles übersehe oder irgendwas vergessen habe, doch warum funktioniert das hier nicht? MAX ist doch eine Konstante:#define MAX 50; int arr[MAX];Fehler:
error C2143: Syntaxfehler: Es fehlt ']' vor ';'Der Fehler ist eigentlich eindeutig, doch da fehlt keine Klammer.
Könnt ihr mir helfen?
lg, freakC++
-
Ergebnis:
int arr[50;];also musst du gemeint haben:
#define MAX 50 int arr[MAX];oder besser:
static const int MAX = 50; int arr[MAX];
-
Ach verdammt. Da kommt ja kein Semikolon hin. Ich hab schon länger nicht mehr mit Makros gearbeitet.
Danke
lg, freakC++
-
Solltest du auch nicht -)
-
Zeus schrieb:
static const int MAX = 50; int arr[MAX];Wozu soll das static gut sein? Das kann ruhig weggelassen werden.
-
Mentras schrieb:
Wozu soll das static gut sein? Das kann ruhig weggelassen werden.
Wie kommst du darauf?
-
Nukularfüsiker schrieb:
Wie kommst du darauf?
Wie kommst du darauf, dass
statichier notwendig wäre?
-
Nexus schrieb:
Nukularfüsiker schrieb:
Wie kommst du darauf?
Wie kommst du darauf, dass
statichier notwendig wäre?Ich habe nicht gesagt, dass es notwendig wäre. Der Kontext ist unbekannt, deshalb wunderte es mich, wie Mentras zu dem Schluss kommt, dass es ruhig weggelassen werden kann.
Wenn es in einer Klassendeklaration steht, dann ist static angebracht. Wenn es frei im Source steht, womöglich noch ohne Namespace drumherum, ist es sogar mehr als angebracht.
Edit: ich würde sowieso ein
enum { MAX = 50 }vorziehen
-
[quote=Nukularfüsiker]Edit: ich würde sowieso ein enum { MAX = 50 } vorziehen[/quote]
Warum?
-
Nukularfüsiker schrieb:
Ich habe nicht gesagt, dass es notwendig wäre. Der Kontext ist unbekannt, deshalb wunderte es mich, wie Mentras zu dem Schluss kommt, dass es ruhig weggelassen werden kann.
Stimmt, ich habe hier stillschweigende Annahmen getroffen.

Nukularfüsiker schrieb:
Edit: ich würde sowieso ein
enum { MAX = 50 }vorziehen
Warum das? Es handelt sich doch nicht um eine Aufzählung.
-
Nexus schrieb:
Warum das? Es handelt sich doch nicht um eine Aufzählung.
Ach, das hat keinen besonderen Grund den ich anderen aufdrängen würde, deshalb auch der Smiley. Ich mache das eher aus Gewohnheit. Als ich angefangen habe mit C++, da konnte man bei so manchem Compiler in der Klassendeklaration noch keine
const intdefinieren, das musste man extern machen.In Effective C++ wird auf dieses Problem eingegangen, und da stand nun
enumals elegante Alternative, die auch einem Literal näher kommt alsconst. Das hat mir gefallen, ich habs mir angewöhnt und komme schwer davon los.
Einen direkten Vorteil hat es nicht, außer dass es auch mit Dinosauriern wie VC6 funktioniert.
-
siehe auch hier bei Dr Dobbs
http://www.drdobbs.com/184403277;jsessionid=44PQO5SAKQZINQE1GHPCKH4ATMY32JVN
-
Hallo,
ein enum wäre hier völlig falsch, da es ich um keinerlei Aufzählung handelt, sondern um eine Arraydeklaration. Auch static brauche ich hier nicht. Mir ging es nur um define. Ich habe ebene schlichtweg vergessen, dass man kein Semikolon setzen darf. Mehr als diese Arraydeklaration steht in meinem Programm nicht drin
lg, freakC++
-
freakC++, du solltest Konstanten (mit
const) aber Makros vorziehen. Alleine schon wegen des Scopes.
-
Das mach ich auch. Ich wollte nur einen Beispielcode ausprobieren und als mein Compiler rummeckerte, wusste ich nicht warum. Normalerweise arbeite ich mit const. Dennoch finde ich es wichtig, auch zu wissen, wie es mit define gehen würde.
edit: Wenn ich mal wieder eine Frage poste, dann beruht das meistens auf ein Themengebiet das ich gerade durchnehme und auf kein Programm, das ich gerade schreibe. Deswegen sind meine letzen Posts auch von unterschiedlichen Themen, die erstmal nichts miteinander zu tun haben.

lg, freakC++
-
freakC++ schrieb:
ein enum wäre hier völlig falsch, da es ich um keinerlei Aufzählung handelt
nein, es würde genau so gut gehen
und wo steht geschrieben, dass man enum nur für aufzählungen benutzen darf?ich nutze enum für solche dinge auch von Zeit zu Zeit - hat den Vorteil, dass man den Typen seperat ändern kann ohne nen typedef drauf zu brauchen
vrgl bei einem array:
#define SIZE 50 char buf[SIZE];mit allen nachteilen, die der präprozessor so bietet(keine typsicherheit, stumpfe textersetzung, ...), vorteile dieser lösung kann ich nicht erkennen
#include <cstddef> const std::size_t SIZE = 50; char buf[SIZE];+typsicherheit
-der typ ist eben auch nötig -> noch mehr schreibaufwand als man das selbst hier schon hatenum { SIZE = 50 }; char buf[SIZE];ist hingegen typsicher und minimaler aufwand
bb
-
Wie?? Du benutzt ein enum, um Konstanten zu deklarieren?
lg, freakC++
-
freakC++ schrieb:
Wie?? Du benutzt ein enum, um Konstanten zu deklarieren?
Kein Grund zur Entrüstung, vor allem nicht wenn man selbst Konstanten per #define anlegt (und dabei versagt).
Wie gesagt, es steht sogar in Effective C++, ein anerkanntes Standardwerk. Wobei die Gründe dafür nicht mehr so aktuell sind.Es spricht auch technisch überhaupt nichts dagegen. Über die Semantik könnte man sich vielleicht streiten.
Kannst ja mal eine bessere Möglichkeit zeigen, wie man Konstanten anlegt, die keine Adresse haben sollen.
-
Kinners,
ich bin nicht entrüstet, sondern stelle neugierig aus meinem Unwissen eine Frage. Außerdem habe ich bereits betont, dass ich das mit dem define aus reiner Neugier gemacht habe, weil ich es wissen wollte! Nur weil ich einmal mit define gearbeitet habe und dabei einen Fehler gemacht habe, heißt das nicht, dass ich ein define Fanatiker bin :p .
Vielleicht ist das eine Methodik, die ich noch nicht kenne und die ich noch lernen kann. Ich gebe zu, dass ich kein Profi bin und wirklich noch viel lernen muss, doch man darf doch neugieirge Fragen stellen.
lg, freakC++
-
freakC++ schrieb:
ich bin nicht entrüstet
Doch! Zwei Fragezeichen sind ein unmissverständliches Zeichen dafür! :p
freakC++ schrieb:
Vielleicht ist das eine Methodik, die ich noch nicht kenne und die ich noch lernen kann.
Man kann auch
enumnehmen, es hat keinen wirklichen Vorteil. Ich persönlich nutzeenumallerdings nur für Aufzählungen. Mitconst typefür unabhängige Konstanten hat auch mehr Kontrolle über den genauen Typ. Denn sobald es kein Integer mehr ist, muss man wieder zuconst typegreifen. Da bin ich lieber gleich konsistent.
-
Nexus schrieb:
freakC++ schrieb:
freakC++ schrieb:
Vielleicht ist das eine Methodik, die ich noch nicht kenne und die ich noch lernen kann.
Man kann auch
enumnehmen, es hat keinen wirklichen Vorteil. Ich persönlich nutzeenumallerdings nur für Aufzählungen. Mitconst typefür unabhängige Konstanten hat auch mehr Kontrolle über den genauen Typ. Denn sobald es kein Integer mehr ist, muss man wieder zuconst typegreifen. Da bin ich lieber gleich konsistent.Sehe ich auch so.
Den Nachteil, den unskilled anführt kann ich nicht so ganz ernst nehmen.

unskilled schrieb:
-der typ ist eben auch nötig -> noch mehr schreibaufwand als man das selbst hier schon hat
Auch das mit der Adresse ist auch ein wenig fragwürdig. Aus Performancegründen würde ich so etwas sicher nicht machen, vor allem, weil ich mich darauf verlasse, dass so etwas komplett wegoptimiert wird.
Und einen guten Grund, dass es wichtig ist, dass eine Konstante keine Adresse hat würde ich auch gerne kennen.