Newsgroup: it.comp.lang.c++
Titolo: #define di stringhe

E' possibile fare con le stringhe quello che si fa con i numeri?
   #define MYDEF 3
   // GOOD funziona, viene sostituito ovunque in 1 , 2 , 3 , 4
   #define GOOD 1 , 2 , MYDEF , 4
   // BAD non funziona viene sostituito con "1 , 2 , MYDEF , 4"
   #define BAD "1 , 2 , MYDEF" , 4
Ho provato con questa forma
   #define TEST(MYDEF) "1 , 2 , " #MYDEF " , 4"
Pero' MYDEF non viene sostituito, quindi sono comunque obbligato ovunque a
usare la macro come TEST(3).
Per ragioni che non vi sto' a spiegare non posso usare const o funzioni che
riestituiscono stringhe.
E' un limite della #define?

 E' un limite della #define?
No, non credo. Qualsiasi cosa tu metta tra " e " viene considerata come
stringa e non viene toccata, non solo con i #define....
Tommy

 #define BAD "1 , 2 , " MYDEF " , 4"
Pero' sono obbligato a passare tramite due define:
#define MYDEFN 3
#define MYDEFS "3"
ed usarle rispettivamente in :
#define GOODN 1 , 2 , MYDEFN , 4
#define GOODS "1 , 2 , " MYDEFS " , 4"
Io vorre cambiare il numero 3 in uno solo posto e automaticamente riversarlo
in altre due define di tipo diverso (spero di essermi spiegato meglio).
Lo so che sembra orribile ma è una pura curiosità .
[OT]---[OT]---[OT]---[OT]---[OT]---[OT]
ATTENZIONE! Per spiegare da dove è scaturita questa richiesta citerò nello
specifico l'ambiente di sviluppo, quindi è una cosa OT su questo NG e se non
siete interessati *non leggetela*.
In VC++ il versioning è gestito nel file MyApp.rc in questo modo:
<cut>
 PRODUCTVERSION 1,2,3,4
<cut>
VALUE "ProductVersion", "1, 2, 3, 4\0"
<cut>
Nel mio progetto devo gestire 4 versioni differenti, e quindi ho 8 posti in
cui cambiare il numero di build (normalmente uso l'ultima cifra, non la
terza come ho riportato nel mio post). Per pur diletto studiavo la
possibilità di ridurre al minimo i posti in cui dover cambiare tale valore.
Attualmente uso questo schema
#define BUILD 1277
#define SBUILD "1277"
#define VERSIONE_CUSTOMER1_STR "14, 0, 0, " SBUILD "\0"
#define VERSIONE_CUSTOMER2_STR "13, 0, 0, " SBUILD "\0"
#define VERSIONE_CUSTOMER3_STR "16, 0, 0, " SBUILD "\0"
#define VERSIONE_CUSTOMER4_STR "18, 0, 0, " SBUILD "\0"
#define VERSIONE_CUSTOMER1 14,0,0,BUILD
#define VERSIONE_CUSTOMER2 13,0,0,BUILD
#define VERSIONE_CUSTOMER3 16,0,0,BUILD
#define VERSIONE_CUSTOMER4 18,0,0,BUILD

#define MYDEFS "3"
[cpp.stringize] 16.3.2 The # operator
sbirish.

 [cpp.stringize] 16.3.2 The # operator
Non ho capito se vuoi confermare la cosa o smentire.
L'operatore #, proprio in base a quello che c'e` scritto da quelle 
parti, vale solo per macro con parametri, ed e` usabile solo con i 
parametri.
E non puo` usare
     #define BUILD 1234
     #define VERSIONE_CUSTOMER_1_STR(build) "14, 0, 0, "#build
     ...VERSIONE_CUSTOMER_1_STR(BUILD)
   => "14, 0, 0, ""BUILD"
Perche` i parametri delle macro preceduti da # o ## non sono espansi 
preventivamente, come si legge al punto immediatamente precedente...
(peraltro, il "\0" specificato esplicitamente non dovrebbe essere 
necessario, visto che le costanti  stringa sono gia` di per se` 
zero-terminated).
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 zero-terminated).
Per ragioni che ignoro il file MyApp.rc definice le stringhe delle versioni
terminandole esplicitamente con \0, quindi ho mantenuto questa
rappresentazione perchè non vorrei che rimuovendola possano avvenire
side-effect imprevedibili (sopratutto distribuendo il software in giro per
il mondo).

terminandole esplicitamente con \0
   Perche` la parte StringFileInfo di quella risorsa e` definita
cosi`: la prima stringa null-terminated identifica il nome
dell'attributo ("CompanyName", "LegalCopyright", ecc.), le successive
stringhe null-terminated rapresentano uno o piu` valori per
quell'attributo. Poiche` i valori possono essere piu` d'uno, chi
utilizza quella risorsa deve essere messo facilmente in grado di
capire quando sono finiti i valori e inizia il nome di un altro
attributo. L'ultimo valore di un attributo deve essere seguito da una
stringa vuota (un singolo carattere nullo) o, se preferisci, l'ultimo
valore e terminato con due caratteri nulli.
f/up it.comp.programmare.win32
-- 
S.L.

 preventivamente, come si legge al punto immediatamente precedente...
ma puň fare cosě:
#define BUILD 1234
#define STRINGIZE_HELPER(param) #param
#define STRINGIZE(param) STRINGIZE_HELPER(param)
#define VERSIONE_CUSTOMER_1_STR(build) "14, 0, 0, " STRINGIZE(build)
dovrebbe funzionare...


Si, funziona. Grazie mille.

 usare la macro come TEST(3).
Please, use this:
#define TEST(MYDEF) "1 , 2 , " ## #MYDEF ## " , 4"
Funziona...parola di AlterX!
--------------------------------
Inviato via 
http://usenet.libero.it