n° 185
Maggio/Giugno 2013
Maggio 25, 2013, 10:45:41 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Token-Pasting Operator (##)  (Letto 471 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Alfredo.s
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 17


Mostra profilo
« inserita:: Giugno 18, 2012, 06:23:51 pm »

Salve, ho questo semplice codice

Codice:
#define FILE "prova"
#define FILE_EXT FILE##".txt"

perchè con Visual C++ me lo compila senza errori, mentre con GCC mi da il seguente errore: "pasting does not give a valid preprocessing token" ? dove sbaglio?
Registrato
Hyde
Global Moderator
Hero Member
*****

Karma: +47/-7
Scollegato Scollegato

Messaggi: 3266


I am a man who walks alone


Mostra profilo WWW
« Risposta #1 inserita:: Giugno 20, 2012, 10:31:48 am »

Per una risposta più completa dovremmo invocare il sommo MAW, in qualità di guru dello standard C e delle varie implementazioni dello stesso. (mi auguro che intervenga perché ormai questa storia mi ha incuriosito).

Il motivo principale dell'errore credo venga da fatto che Token-pasting operator è usato per unire token non rappresentati da string literals.
L'unione di costanti stringa viene effettuata semplicemente definendo una costante con i 2 argomenti stringa adiacenti. Il che significa che il tuo codice può essere riscritto come
Codice:
#define FILE "prova"
#define FILE_EXT FILE".txt"

Sarà compito del compilatore quello di concatenare le due stringhe.

Probabilmente la Microsoft è più elastica e ti permette anche di usare gli ##..

MAW, tu che ne pensi? Sorriso
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
http://myitside.blogspot.com
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +205/-15
Scollegato Scollegato

Messaggi: 2706


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #2 inserita:: Giugno 20, 2012, 03:47:41 pm »

MAW, tu che ne pensi? Sorriso

Da un lato, si deve rilevare che nel caso in esame il token pasting non è in alcun modo necessario, risolvendosi come già suggerito in un mero constant strings merging e funzionando perfettamente anche senza alcun operatore, per pura giustapposizione.

Dall'altro lato, tuttavia, è tradizione invalsa in quasi tutti i compilatori C per PC (incluso, si badi bene, lo stesso GCC nelle versioni precedenti alla 3!!!) effettuare un silent drop del doppio cancelletto, ovvero semplicemente ignorarlo in fase di parsing, laddove usato in modo ridondante.

Ecco quindi un'ennesima occasione nella quale GCC dimostra di saper trasformare senza un reale motivo il giusto rigore sintattico in controproducente rigor mortis, rendendo necessario un inutile e fastidioso refactoring manuale per numerosi sorgenti altrimenti perfettamente funzionanti.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
VBeXtreme
Sr. Member
****

Karma: +17/-99
Scollegato Scollegato

Messaggi: 662



Mostra profilo
« Risposta #3 inserita:: Giugno 21, 2012, 07:58:12 am »

Secondo me è casa M che sbaglia!
I caratteri pound vengono usati con i parametri di una direttiva e non con la direttiva stessa.
Gcc sbaglia o avverte che si sta facendo qualcosa di inutile? o ancora meglio sbagliato?
 
Registrato

Ragionare non è nient’altro che calcolare
"Thomas Hobbes"
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page