Newsgroup: it.comp.lang.c
Titolo: [?] Macro

Ho cominciato ad apprendere la programmazione C in ambiente Windows con le
Api Win32 grazie al tutorial scritto da Alex Martelli (approfitto
dell'occasione per ringraziarlo pubblicamente)
In questo tutorial viene fatto riferimento al concetto di MACRO ...
Qualcuno puo' spiegarmi cosa si intende con questo termine?
Ciao e grazie.

 Qualcuno puo' spiegarmi cosa si intende con questo termine?
Un simbolo definito con la direttiva per il preprocessore #define. Es.:
#define PIPPO 10
significa che, prima della compilazione, tutte le occorrenze di PIPPO
(in maiuscolo, il procedimento è case-sensitive) vengono sostituite con
10.
EMG

> Un simbolo definito con la direttiva per il preprocessore #define. Es.:
In pratica e' una costante, se ho capito bene ... pero' non capisco il
costrutto della WinMain, allora.
int WINAPI WinMain(HINSTANCE hInst,  ...
E' una funzione che accetta vari parametri e ritorna un intero, ma quel
WINAPI (che e' una macro) a cosa serve li'?

WINAPI (che e' una macro) a cosa serve li'?
Bisogna vedere come e' definita. Puo' anche andarci bene.
Spesso, infatti, queste macro non sono realmente necessarie, ma
vengono definite comunque, per motivi di portabilita' e
compatibilita'. 
--
Andrea Laforgia
andrea_...@bigfoot.com

 Qualcuno puo' spiegarmi cosa si intende con questo termine?
Si intende macro per il preprocessore, un po' diverso dalle macro a cui
siamo abituati.
Semplicemente dici al compilatore che, d'ora in avanti, ogni volta che
scrivi una parola, lui deve sostituirla con una (o più) altra.
Es:
#define PIPPO int main
PIPPO (){
return 0;
}
E dovrebbe funzionare (? non ho provato, però).
Talvolta diventa utile per definire delle vere macro (funzioni in-line, se
preferisci, anche se c'è un po' di differenza). Prova a vedere tra gli
header standard se trovi qualche macro con parametri, se no accontentati di
questa:
#define PIPPO(a) int main(a)
PIPPO(void){
return 0;
}
Ciao e buone feste.
--
Alessandro Monti

 WINAPI (che e' una macro) a cosa serve li'?
E' una estensione non standard. E' definita come
#define WINAPI far pascal
(almeno in Win16) e credo serva ad impostare la modalità di passaggio
dei parametri sullo stack. Ma è meglio se domandi in
it.comp.programmare.win32.
EMG

}
Brrrrr... mi vengono i brividi :)
#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) 
main()
{
    int a = MIN(3,5) ;
}
--
Andrea Laforgia
andrea_...@bigfoot.com

 
andrea_...@bigfoot.com
Attento a dare di questi consigli: e' sconsigliato usare piu' di una
volta gli argomenti di macro, a meno che non si sa' a priori che non
si useranno MAI argomenti che abbiano effetti collaterali:
int n=4;
MIN(5,++n);
Magari tu sei esperto e puoi farlo, ma uno con meno esperienza che
abbocca e usa la tua macro MIN diventa cretino due notti
a debuggare. :-)
E' bene specificare che una MACRO non e' sostitutiva di una funzione.
Tu lo sai benissimo, perdo un po' di tempo perche' a domanda
"cosa e' una MACRO" si deduce che l' argomento e' nuovo.
I parametri di funzione vengono valutati come espressioni una sola
volta e i valori calcolati passati alla funzione a run time.
La macro e' un concetto che esiste sono per il preprocessore che non e'
altro che un elaboratore di testo standard che accompagna sempre il
compilatore C, puo' essere anche eseguito dallo stesso processo o in
due fasi separate. Il sorgente che il compilatore compilera' sara'
comunque quello che il preprocessore ha trasformato.
I paramerti di macro saranno ricompilati come espressioni da valutare
tutte le folte che sono usati. Le macro definite dall' ANSI come
standard
garantiscono di non avere effetti collaterali.
ciao.

 #define MIN(a,b) ( (a) < (b) ? (a) : (b) )
Non è che tu vai meglio...
--
Alessandro Monti

si useranno MAI argomenti che abbiano effetti collaterali:
Giusta osservazione, ma era ovviamente un esempio per dimostrare un
possibile uso di una macro, che il piu' delle volte risulta utile.
--
Andrea Laforgia
andrea_...@bigfoot.com

Non č che tu vai meglio...
be', insomma, per lo meno e' piu' utile ;)
--
Andrea Laforgia
andrea_...@bigfoot.com

> be', insomma, per lo meno e' piu' utile ;)
Sono d'accordo, ma mi piaceva usare le macro per qualcosa di anomalo, tanto
per dimostrare che č solo una sostituzione di testo, indipendente dalle
normali regole sintattiche e semantiche del linguaggio, tant'č che non č
neanche vista dal compilatore ma solo dal pre-processore.
Per inciso, riterrei utile in una eventuale FAQ del C o del C++, dire che
anche gli include altro non sono che pezi di programma che il preprocessore
"appiccica" al sorgente prima di compilarlo. Credo che forse toglierebbe
alcuni dubbi sul loro uso e su cosa devono contenere.
Ancora per inciso, se le macro del C fossero un po' piů potenti, si
potrebbero simulare i template del C++, o forse sono questi ultimi che sono
un'estensione delle macro del C? ;-)
--
Alessandro Monti