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

Credo che dichiarando costanti simboliche (si chiamano cosě ? sono niubbo)
si possa fare, dichiari i #define all'inizio del codice e, almeno per me, ha
funzionato.
Ciao, Francis

Ciao a tutti,
sto riprendendo a programmare in C dopo un po di tempo e mi è capitato di
dover scrivere del codice molto ripetitivo. Poichè per motivi di performance
non posso far uso di procedure, esiste la possibilità di dichiarare del
codice (cioè più linee) all'interno di una macro? e se sì come si definisce?
Grazie 1000
@nto



Esiste ma non e' consigliabile.
Basta definire una macro come un corpo { }.
#include <stdio.h>
#define MACRONA { printf( "ciao " ) ;\
                  printf( "sono " ) ;\
                  printf( "una macro\n" ) ;\
                }
int main()
{
        MACRONA
        scanf( "%*c" ) ;
        return 0;
}
In realta' le macro (specie quelle con parametri) sono molto
pericolose e non andrebbero usate.
Per questi scopi si utilizzano le funzioni.
Non so se il nuovo standard C99 contempli le funzioni inline.
In C++, per esempio, queste tendono a sostituire l'uso di macro.
--
Andrea Laforgia (ICQ 87230455)
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

codice (cioè più linee) all'interno di una macro? e se sì come si definisce?
In C l'andare a capo in quasi tutti i contesti e' esattamente
uguale ad uno spazio. Per rendere piu' leggibile la macro puoi
semplicemente usare come ultimo carattere della linea "\" che
indica che la macro prosegue sulla linea successiva...
Questo programmino mostra un esempio di fratello (molto) minore
dei template C++ realizzato usando il preprocessore del C 
  #include <stdio.h>
  #define Calcola_media(tipo,v)\
    {\
      int i;\
      tipo t;\
      for (t=0,i=0; i<(sizeof(v)/sizeof(t)); i++)\
      {\
        t+=v[i];\
      }\
      media_##v = t/(sizeof(v)/sizeof(t));\
    }
  int main(void)
  {
    int iv[]={1,2,3,4,5},media_iv;
    double dv[]={3.141592654,1,6502.7676},media_dv;
    Calcola_media(int,iv);
    Calcola_media(double,dv);
    printf("media(iv)=%i\nmedia(dv)=%f\n",
           media_iv,media_dv);
    return 0;
  }
Nota che questo vuole essere solo un esempio di macro
"multilinea"... non codice serio.
Secondo me, tranne in contesti molto molto banali,
conviene in questi casi scrivere generatori "esterni"
che creino sorgenti C puliti.
In questi contesti io di solito uso generatori di codice
scritti in PERL che leggono da un file la definizione di
cosa deve essere generato.
In fondo anche il codice del generatore e' codice e
come tale dovra' essere manutenuto; impazzire dietro ai
limiti del preprocessore C secondo me e' sbagliato...
In testa al codice "C" generato genero sempre un commento
che avvisa di non modificare manualmente il file in
quanto potrebbe essere rigenerato cancellando le
modifiche: per mantenere gestibile la cosa e' secondo
me importante separare nettamente il codice creato
automaticamente da quello inserito manualmente (non sono
affatto a favore dei "wizard" per intenderci).
Una ragione importante e' che anche il codice generato
automaticamente potrebbe contenere bug o richiedere
manutenzione... se venisse modificato manualmente questo
codice diventa non piu' rigenerabile (a meno di perdere
tutti gli interventi fatti).
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff