Newsgroup: it.comp.lang.c
Titolo: Macro e commenti

Mi sono chiesto se è possibile generare un commento utilizzando una
macro ed ho cercato un po' online, ma non ho trovato nulla. Ho fatto
qualche esperimento, ma l'unico risultato ottenuto è stato un warning
dal gcc-3.2 con il seguente codice ed anche digragh e trigraph non mi
sono stati d'aiuto.
test.cpp:6:9: warning: pasting "/" and "/" does not give a valid
preprocessing token
+++ code +++
#define LOG /##/
int main()
{
        LOG return 1;
        return 0;
}
+++
Qualcuno mi sa dire se è possibile e quanto è portabile generare "//"
con una macro?
-- 
On the subject of C program indentation:
        "In My Egotistical Opinion, most people's C programs should be
        indented six feet downward and covered with dirt."
                -- Blair P. Houghton

con una macro?
Se ricordo bene i commenti vengono rimossi in una
fase precedente all'espansione delle macro.
Questo implica che se anche tu riuscissi a generare
dei commenti con una macro il programma poi non
risulterebbe compilabile... perche' il compilatore
non si aspetta piu' di trovare commenti dopo quella
fase. Il warning che hai avuto mi sembra in linea
con questa visione (in pratica ti dice che "//" non
e' una sequenza valida in un programma C++ ovvero
che non lo e' dopo che si sono rimossi i commenti).
Forse potresti usare in alternativa qualcosa come
   #define LOG(x)
   ..
   LOG( return 1; )
   return 0;
Io ho pero' trovato in passato alcuni problemi di
portabilita' quando si usa il preprocessore in modo
"creativo".

 }
Non so se sia possibile farlo, comunque puoi fare una cosa del genere
(io la uso spesso):
#define LOG
int main(void){
   #if defined(LOG)
   return 1;
   #else		//altrimenti se LOG e' definito ti da' un
   return 0;		//warning perche' non riesce a raggiungere
   #endif		//il return 0...
   }
Se poi tu commenti il define, LOG non e' piu' definito e la funzione
ritorna 0.
NB: questo uso degli #if #else #endif per testare la condizione dei
define rallenta il compilatore
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

   #define LOG(x)
Oppure,
#ifdef ENABLE_XYZ
#define xyz_func(x, y, z) __xyz_func_real(x, y, z)
#else
#define xyz_func(x, y, z) ((void) 0)
#endif
E poi nel codice usare xyz_func().
Con gcc funziona, non so con altri compilatori. Inoltre, non so neppure
se e` questo che ti serva, spero di aver azzeccato :).
Ciao.
-- 
void

 "creativo".
In fondo la creatività è l'anima del progresso, anche se in certi ambiti
bisogna utilizzare tecniche più consolidate.
Hai qualche esempio di accoppiata burrascosa tra macro ed un
compilatore?
Grazie,
Derfel.


compilatore?
Io avevo scritto delle macro che chiamavo come
   DEFOP(OpAdd,+)
   DEFOP(OpSub,-)
   DEFOP(OpMul,*)
   DEFOP(OpDiv,/)
che mi servivano per la generazione del codice di
una virtual machine che interpretava l'output di
un compilatore. Avevo usato questo approccio per
evitare ripetizioni (per ognuna delle operazioni
venivano create diverse istruzioni VM).
Purtroppo mi sono accorto che non tutti i compilatori
concordavano su cosa fosse legale e cosa invece
non lo fosse; ho quindi cambiato passando a usare
come generatore di codice PERL invece del
preprocessore del compilatore C.
Andrea