Newsgroup: it.comp.lang.c++
Titolo: Sarà il compilatore?

Ciao a tutti.
Ho un problema. 
In una classe che uso c sono definite delle "static const int".
Queste le vorrei usare come "case" in uno switch, ma in fase di compilazione
(VC++6.0) ottengo l'errore "case expression not constant".
Eppure ricordo (ma è passato un pò di tempo e il libro nn l'ho a portata di
mano) di aver letto un esempio di Stroustrup in cui usava un cont int.
Nn sarà x caso il compilatore nn conforme allo standard?
-- 
Posted from  [192.106.52.2] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Nn sarą x caso il compilatore nn conforme allo standard?
Nessun compilatore lo e'.
Non so cosa tu abbia scritto ma il seguente compila,
sia con VC++ che con GCC 3.0
static const int a = 3;
static const int b = 5;
int main(){
        int ciccio = a;
        switch(ciccio) {
           case a: break;
           case b: break;
        };
}
-- 
Posted from 
dell-01.mm.eutelsat.org
 [194.214.173.17] 


 
Cosě funziona (funzionava visto che c avevo provato prima di postare)
anche a me.
Il problema nasce dal fatto che la definizione di queste costanti (sono codici
di errore) sono definiti in un'altra classe di cui io includo solo il .h e il
.lib
Il compilatore che uso č il VC++6.0
ciao 
PS:son rimasto sorpreso dal mio stesso uso del nome "ciccio" per la variabile
8-)
-- 
Posted from  [192.106.52.2] 


E` VC++ che non e` conforme.
Nessun compilatore lo e` al 100%, ma VC e` un caso patologico!  :(
Paolo

 .lib
Scusa, ma non riesco a capire come hai organizzato il programma; potresti
fare un copia-incolla del tuo codice? (Ovviamente togli le parti che non
hanno nulla a che fare con il problema)

 hanno nulla a che fare con il problema)
La riscrivo xchè l'altra nn è arrivata.
Credo d aver capito il problema.
//***CodiciErrore.h***//
class COD_DLL_SPEC CodiciErrore
{
[...]
public:
  static const int ERR_INVALID_BUFFER;
  [...]
} 
//***CodiciErrore.cpp***//
[...]
const int CodiciErrore::ERR_INVALID_BUFFER = 10;
[...]
Di qsta si fa una dll di cui includo il .h e il .lib
(credo che sia oramai OT) ed è qui che nasce il problema. Qndo compilo nn ha le
costanti numeriche definite e penso sia per qsto che ottengo l'errore.
(nel mio codice
int convError (int typeError)
{
  switch (typeError)
  {
   case CodiciErrore::ERR_INVALID_BUFFER:
   {
    return STATUS_KO_INVALID_DATA;
   }
   break;
   }
}
)
Chi sviluppa tale parte ha sostituito le const con #define e funziona.


 costanti numeriche definite e penso sia per qsto che ottengo l'errore.
Non so quale possa essere il problema, ma in ogni caso ti metto in guardia
sul
fatto che se non ci vai con le pinze variabili statiche definite in una dll
finiscono
per avere valori diversi nell'exe (se non le inizializzi anche li)!!! Se
dovessi ad esempio implementare
un singleton (con il puntatore statico inizializzato nel .h per intenderci)
sarebbe un disastro.
-- 
Posted from 
dell-01.mm.eutelsat.org
 [194.214.173.17] 


oPKo wrote:
[ snip ]
In questo caso e' impossibile compilare lo switch, infatti le espresioni 
nei case devono essere costanti e note a tempo di compilazione, invece,
essendo definite in una libreria a parte, saranno note solo in fase di
link. 
Puoi ovviare il problema in due  modi:
1) 
        Assegnare il valore alle costanti direttamente nel file header:
class COD_DLL_SPEC CodiciErrore
{
[...]
public:
  static const int ERR_INVALID_BUFFER = 10 ;
  [...]
} ;
Non so se il tuo compilatore lo consente, quella di assegnare variabili 
costanti nella dichiarazione  e' una feature aggiunta solo ultimamente.
(tra parentesi, forse invece di una classe, e' piu' indicato un namespace)
2) 
        Usare degli enum, almeno finche' il punto 1) non potra' essere usato.
class COD_DLL_SPEC CodiciErrore
{
[...]
public
   enum Codici {
        ERR_INVALID_BUFFER = 10 ,
        ERR_altri_codici        = 11,
        etc..
    }
  [...]
} ;
In entrambi i casi , al momento di compilare lo switch, i valori dei codici 
d'errore saranno noti.
Saluti,
Fabio
-- 
Posted from 
flopiano.mm.eutelsat.org
 [194.214.173.28] 


 (tra parentesi, forse invece di una classe, e' piu' indicato un namespace)
Dove per ultimamente si intendono quei cinque o sei anni in cui, ad
esempio, Java e' nato, e' uscito in 3 o 4 versioni maggiori e svariate
minori ed ha conquistato mezzo mondo (informaticamente parlando). Non ci
sono scuse.
Ciao,
Nicola
P.S. Il mio e' un commento contro un noto produttore di compilatori ed
altro, non intendevo implicare che tu giustificassi il suo
comportamento.

Nn sarà x caso il compilatore nn conforme allo standard?
Proprio cosi'.
Il Ghenio
-----
These are my parting words to you:
those who give up are doomed!
-----