Forum: PC-Programmierung const int in Header Datei schreiben


von Bernd S. (Gast)


Lesenswert?

Ich habe eine switch case Anweisung und möchte die definierten 
Konstanten für die einzelnen "case"-Falle in einer Header Datei 
auslagern.

Ich programmiere in C und mit
const int FALL1 = 1;
const int FALL2 = 2;
die in der Header Datei stehen, bekomme ich eine Fehlermeldung!
Die Header Datei ist dem Hauptprogramm bekannt.

Wie kann das denn ? Was muss ich ändern ?

von Zepettl (Gast)


Lesenswert?

Nimm #define

Variablen sind in switch/case nicht zulässig. "Konstanten" à la const 
int sind Variablen, auch wenn sie sich nicht ändern können.

von Uhu U. (uhu)


Lesenswert?

#define ist nicht umbedingt das Mittel der Wahl - Fehler mit Macros 
können wirklich sehr verzickt sein...

Ich würde folgende Vorgehensweise empfehlen:

- In genau einem Modul werden die Konstanten definiert

   const int FALL1 = 1;
   const int FALL2 = 2;

- Im Headerfile werden sie deklariert:

   extern const int FALL1;
   extern const int FALL2;

Dann sind sie in allen Quellmodulen bekannt, die den Herder #includen.

Eine elegantere Möflichkeit wäre, die Konstanten als enum im Header zu 
definieren:

   typedef enum { FALL1 = 1, FALL2 = 2 } FAELLE;

Enumwerte können auch in case-Labels benutzt werden.

von Bernd S. (Gast)


Lesenswert?

Hallo !
Genau so wie es bei Dir deklariert worden ist, habe ich es in meinem 
Programm geschrieben.

extern const int FALL1;
extern const int FALL2;

Dabei erhalte ich immer diese Fehlermeldung...

error C2065: 'FALL1' : undeclared identifier
error C2051: case expression not constant

Was nun, jemand ne Idee?

Ich muss noch dazu sagen, das ich mit Visual Studio (VisualC++) 
programmiere. Hat das damit irgendwas mit zu tun ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die erste Fehlermeldung riecht verdächtig.

An der Stelle im Code, an der diese Fehlermeldung ausgegeben wird, ist 
"FALL1" nicht bekannt.

Poste Deinen vollständigen Code, sonst wird das nichts.

Übrigens solltest Du Variablennamen -ja, const int ist eine Variable- 
nicht in Versalien schreiben. Die Konvention sieht diese Schreibweise 
für #defines vor.

von yalu (Gast)


Lesenswert?

> Die erste Fehlermeldung riecht verdächtig.

Selbst wenn das Programm dahingehend korrigiert wird, dass die erste
Meldung nicht mehr erscheint, bleibt immer noch die zweite.

In C deklariert der const-Qualifier eine Variable zwar als read-only,
d.h. ihr kann kein Wert zugewiesen werden. Trotzdem stellt sie keine
constant-expression im Sinne der C-Syntax dar und kann deswegen
insbesondere nicht als case-Ausdruck oder als Größe in einer
Array-Deklaration benutzt werden. Hier müssen Enums oder Makros
verwendet werden, wenn man konstante Ausrücke per Namen ansprechen
will.

Anders verhält es sich in C++. Hier werden mit const echte Konstanten
deklariert, die auch in case-Ausdrücken und Array-Deklarationen
erlaubt sind.

von Uhu U. (uhu)


Lesenswert?

Bernd S. wrote:
> Hallo !
> Genau so wie es bei Dir deklariert worden ist, habe ich es in meinem
> Programm geschrieben.
>
> extern const int FALL1;
> extern const int FALL2;
>
> Dabei erhalte ich immer diese Fehlermeldung...
>
> error C2065: 'FALL1' : undeclared identifier
> error C2051: case expression not constant
>

Für switch geht diese Variante:

   typedef enum { FALL1 = 1, FALL2 = 2 } FAELLE;

von Stephan M. (muphin)


Lesenswert?

Hallo allerseits, ich kram mal diesen Thread raus da meine Frage ganz 
gut dazu passt.

Ich hab ein enum
typedef enum { FALL1= 0, FALL2= 1 } FAELLE;

und möchte in einer switch-case Anweisung darauf zugreifen. Damit das 
ganze gut nachvollziehbar ist wollte ich das so machen:
switch( ... )
{
  case FAELLE.FALL1:
    ...
  case FAELLE.FALL2:
    ...
}
funktioniert aber nich! Ohne "FAELLE." funktionierts, is klar, 
wahrscheinlich komm ich auch nur auf so ne "blöde" Idee da ich C# 
gewohnt bin. Habt ihr trotzdem eine Idee wie ich das schön realisieren 
kann?

Grüße Muphin

von P. S. (Gast)


Lesenswert?

Stephan M. schrieb:

> funktioniert aber nich! Ohne "FAELLE." funktionierts, is klar,
> wahrscheinlich komm ich auch nur auf so ne "blöde" Idee da ich C#
> gewohnt bin. Habt ihr trotzdem eine Idee wie ich das schön realisieren
> kann?

Klasse um das enum drum, dann geht FAELLE::FALL1. Evtl. geht es auch mit 
einem Namespace.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das wäre dann C++. C kennt weder Klassen noch Namespaces.

von Karl H. (kbuchegg)


Lesenswert?

enums werden in C häufig überschätzt.

Manchmal hat man das Gefühl, die gibt es in C nur deswegen, weil es sie 
in anderen Sprachen auch gibt.

von Stephan M. (muphin)


Lesenswert?

Karl heinz Buchegger schrieb:
> Manchmal hat man das Gefühl, die gibt es in C nur deswegen, weil es sie
> in anderen Sprachen auch gibt.

Genau :-D
Nur seltsam das C eine der ersten Sprachen war, hmmm....

von P. S. (Gast)


Lesenswert?

Rufus t. Firefly schrieb:
> Das wäre dann C++. C kennt weder Klassen noch Namespaces.

Stephan hat ja im Gegensatz zum OP nicht angegeben, dass es C sein muss. 
Wieder mal so ein Beispiel, wo sich C++ als das bessere C beweist :-)

von Stephan M. (muphin)


Lesenswert?

Is natürlich C, will ja nur ganz rudimentär n µC programmieren (keine 
KLASSENgesellschaft grünen o.ä. :-P)

von Karl H. (kbuchegg)


Lesenswert?

Stephan M. schrieb:
> Karl heinz Buchegger schrieb:
>> Manchmal hat man das Gefühl, die gibt es in C nur deswegen, weil es sie
>> in anderen Sprachen auch gibt.
>
> Genau :-D
> Nur seltsam das C eine der ersten Sprachen war, hmmm....

Aber im Gegensatz zu C haben sich Aufzählungstypen in anderen Sprachen 
weiterentwickelt. In C sind enum so eine halbgebackene Geschichte.
Zwar ein schönes 'must have', aber eigentlich zu nichts so richtig zu 
gebrauchen.

von horst (Gast)


Lesenswert?

> wahrscheinlich komm ich auch nur auf so ne "blöde" Idee da ich C#

ja ;-)

FAELLE ist der Typ. FALL1 & FALL2 sind die Werte, die Variablen von 
diesem Typ annehmen können. = 1 & = 2 weist diesen Weten eine 
Darstellung im Speicher zu, ist also mehr was für uns abstruse C-Hacker 
die int Variablen mit FAELLE Werten vermischen wollen.
1
FAELLE meinFall;
2
3
meinFall = (irgendwas) ? FALL1 : FALL2;
4
5
switch (meinFall)
6
{
7
   case FALL1:
8
      tu (was);
9
      break;
10
   case FALL2:
11
      tu (nichts);
12
      break;
13
14
   default:
15
      schreie (laut);
16
      break;
17
}

Wenn du unterscheiden willst nach dem Wert eines int, schreibst du dann 
auch:

case int.1:
case int.2
?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.