Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035

    [C]Macro e funzioni

    Ho dei dubbi su una differenza fra macro e funzioni: ovvero su come vengono chiamate...
    data una macro a caso, ad esempio:

    codice:
    #define CUBO(x)  x*x*x
    la chiamo passandogli un valore composto:

    codice:
    ris=CUBO(2+5)
    è evidente che senza parentesi nell'espressione della macro, il risultato verrà storpiato. Mi spiego meglio. Invece di fare...

    codice:
    (2+5)*(2+5)*(2+5)
    mi farà...
    codice:
    2+(5*2)+(5*2)+5

    Quindi la macro per essere corretta andrebbe definita nel modo che segue:
    codice:
    #define CUBO(x)  (x)*(x)*(x)
    Veniamo al mio problema: come vengono chiamate queste macro? Nello stesso modo di una funzione, ovvero il risultato della macro viene tornato alla chiamante dopo averlo calcolato in separata sede come avviene per le funzioni o no?

    Il dubbio è subito spiegato... se devo eseguire questa espressione:
    codice:
    ris=100/CUBO(2+5)
    l'espressione viene valutata così:
    codice:
    ris=100/(2+5)*(2+5)*(2+5)
    oppure così:
    codice:
    ris=100/266
    Perchè se è vero il primo caso allora la macro andrebbe definita con ulteriori parentesi esterne in questo modo:

    codice:
    #define CUBO(x) ((x)*(x)*(x))

  2. #2
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    scemo io, potevo provare prima di chiedere...

    Effettivamente l'espressione viene portata accanto alla chiamata diversamente da quanto fa una funzione e mi sballa il calcolo. Così è corretta:

    codice:
    #define Cubo(x)  ( (x)*(x)*(x) )
    Potete cancellare.

  3. #3
    Le macro funzionano semplicemente come sostituzione di testo: in un file intermedio generato dal precompilatore tutte le macro vengono espanse nel codice sorgente.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.