const int in Header Datei schreiben

Gast #843333
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 ?
#843367
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.
Gast #843872
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 ?
Persönliche Seite #843881
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.
Gast #844882
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.
#845465
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;
#1498368
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
Gast #1498398
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.
Gast #1498501
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 :-)
#1498519
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.
Gast #1498550
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
?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren