Newsgroup: it.comp.lang.c++
Titolo: problema nel costrutto if() fra diversi compilatori

Salve,
scrivo ormai da qualche anno programmi c++ sotto linux usando il compilatore
gnu.
Sono ora passato al SGI (silicon graphics) e al suo compilatore CC.
Ho adesso un problema banale di compilazione che pero vorrei risolvere in
modo leggibile e con le minime differenze:
Sotto gnu potevo scrivere:
if(COND1 or COND2){} 
Questo non mi e' accettato sotto SGI (non mi riconosce l' "or")
potrei bypassare il problema:
if(COND1){}
if(COND2){}
Ma non mi piace affatto come scrittura 
(oltre al fatto che almeno scrittu cosi devo duplicare il codice)
Non esiste un altro costrutto, magari + "rigoroso" che il CC possa seguire?
Dove posso trovare poi le specifiche ANSI
(La probabilmente troverei cio' che cerco).
GRazie
Massimo

 Ma non mi piace affatto come scrittura
allora come fai a programmare in C++???

 if(COND1 or COND2){}
??? 
Non avevo mai notato che si poteva fare una cosa del genere :)
Perche' non usi || e && come si usa di solito?
-- 
bunker
+++++++++++[>++++++>++++++++++++++++++++++++++++++++
+>++++++++++<<<-]>.>++++++++++.>.<----------.>---------.<+++++++.

 allora come fai a programmare in C++???
 
:)
Ricordavo proprio che il costrutto if(COND or COND2){} non era
l'unico e neanche il piu' aderente allo standard ma non ricordavo
qual'era l'alternativa e non stavo riuscendo a trovarla in rete.
Cmq if(A || B){} era proprio cio' che cercavo (adesso compila)
Grazie

 !?!? in ke senso? "or" non esiste nel C++
Esiste (vedi [2.11.2]), ma non tutti i compilatori lo implementano.
Max

 Grazie
nessun problema! ma cerca di usare il linguaggio C/C++ e non surrogati
"o zuccheri sintattici" come si definisce questo stile 

Max M. wrote:

Cosa sarebbe (vedi [2.11.2])?
Sto ancora cercando la documentazione per lo standard ANSI C++
e' questa a cui fai riferimento?
Dove posso trovarla?
Massimo

 Dove posso trovarla?
La compri con 18$ al sito dell'ANSI.
http://webstore.ansi.org/ansidocstore/find.asp?find_spec=14882
In rete trovi draft non definitivi del 1996 o 97. GIYF.
Max

 if(COND2){}
or non e' standard, || e' invece standard:
if(COND1 || COND2){} 
 
se ti piace or puoi:
#define or ||
if(COND1 or COND2){}
definendo prima che or equivale a ||, ma te lo sconsiglio.
Tommy

 wrote


No, non credo proprio, quel pezzo dice:
"Furthermore, the alternative representations shown in Table 4 for certain
operators and punctuations (2.5) are reserved and shall not be used
otherwise".
In pratica vuole dire che or, and, not_eq, xor, bit_and etc... sono
riservati e non possono essere usati per altro scopo se non quello di essere
alternative al loro corrispondente.
Lo standard non dice affatto che i compilatori <b>debbano</b>
"implementarli" e non dice nemmeno che sia giusto farlo. Personalmente odio
questi aliases.
Quindi, per cio' che mi riguarda, in C++ standard non si usa "or", visto che
non e' parte dello standard "obbligatorio" e visto che non e' portabile.
Tommy

 if(COND2){}
Non e' la stessa cosa:
nel secondo caso, se entrambe le condizioni sono vere, entrambi i corpi
vengono eseguiti, ovvero:
int n = 5;
if( (5==5) || (6==6) )
{
      ++n;
}
n vale 6.
int n = 5;
if( 5==5 )
{
      ++n;
}
if( 6==6 )
{
      ++n;
}
ora invece n vale 7.
Come vedi non sono la stessa cosa!
Invece, la stessa cosa (beh quasi) puoi ottenerla con:
int true_counter = 0;
if(5==5) ++true_counter;
if(6==6) ++true_counter;
if(true_counter>0){
      /* corpo */
}
in questo modo, se almeno una delle due espressioni e' vera, true_counter
sara' maggiore di 0 e quindi IL corpo verrra' eseguito (una volta solta).
Avere un solo corpo e' meglio in quanto se vuoi modificarlo cosi' basta
cambiarlo in un punto solo e non due.
In alternativa puoi avere un bool e settarlo a true.
Tommy
P.S. per le altre cose/domande ti ho risposto in posts separati.

 
http://webstore.ansi.org/ansidocstore/find.asp?find_spec=14882
O anche sotto forma di libro:
http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470846747.html
Ciao,
Nicola

 non e' parte dello standard "obbligatorio" e visto che non e' portabile.
Il consiglio e' buono, la sua motivazione no.
Ciao,
Nicola

"Nicola Musatti" <Nicola....@ObjectWay.it> wrote
Ok, "balzano" mi piace ;-)
Scherzi a parte credo/evo che fossero keywords riservate, ovvero che se le
scrivi nel codice generino errore (a meno che non usate nel modo giusto):
int or = 5;
double not_eq = 3.7;
ERRORE!
Non credevo che lo standard dicesse che debbano necessariamente essere
implementati, pensavo che per ora si fossero limitati a riservare le parole
chiavi, per non creare troppi backward compatibility errors quando un domani
sarebbero state introdotte nel prossimo standard.
A quanto mi dici sono gia' in pieno uso nello standard attuale e francamente
questa cosa mi pare poco sensata.
Non c'e' da meravigliarsi che molti compilatori non le implementino o che le
implementino solo quando uno switch e' abilitato.
Ah,
if(num??(a:> not_eq ??-o)??<a xor_eq z%>
w il C++ e ste "balzanate" di keyword-alias, digraphs e trigraphs.
Tommy

 w il C++ e ste "balzanate" di keyword-alias, digraphs e trigraphs.
e.. ovviamente in mezzo a questa porcheria di C++ "standard" ho dimenticato
un ;  !
Tommy