Sì. L'operatore di preprocessore di concatenazione (##
) causerà problemi, ad esempio:
#define _add_penguin(a) penguin ## a
#define add_penguin(a) _add_penguin(a)
#define WIDTH (100)
#define HEIGHT 200
add_penguin(HEIGHT) // expands to penguin200
add_penguin(WIDTH) // error, cannot concatenate penguin and (100)
Lo stesso vale per stringization (#
). Chiaramente questo è un caso d'angolo e probabilmente non importa considerando come sarà presumibilmente usato WIDTH
. Eppure, è qualcosa da tenere a mente sul preprocessore.
(Il motivo per aggiungere il secondo pinguino non è un dettaglio sottile delle regole di pre-elaborazione in C99 - iirc si riesce perché concatenare due token di preelaborazione non placeholder deve sempre risultare in un singolo token preelaborazione - ma questo è irrilevante, anche se fosse concessa la concatenazione, avrebbe comunque dato un risultato diverso rispetto allo #define
non presidiato!).
Tutte le altre risposte sono corrette solo nella misura in cui non ha importanza dal punto di vista dello scanner C++ perché, in effetti, un numero è atomico. Tuttavia, alla mia lettura della domanda non vi è alcun segno che solo i casi privi di ulteriore espansione del preprocessore debbano essere considerati, quindi le altre risposte sono, anche se sono completamente d'accordo con i consigli ivi contenuti, errate.
fonte
2012-01-31 14:59:06
mi limiterò a lasciare questo qui: http://www.parashift.com/c++-faq-lite/inline-functions. html # faq-9.5 (Cerca i collegamenti sul perché le macro di # define' sono malvagie). –
@TReddy Grazie, ma non si sostituisce un '#define WIDTH (100)' con 'inline int width() {return 100; } vuoi ?! – weston
No, volevo condividere i link sul perché le macro sono malvagie e quei collegamenti sono stati raccolti in quella sezione sulle funzioni inline (che è ortogonale alla tua domanda). Nella tua situazione, una macro ti dà risultati migliori di una 'static int width = 80 + 20'? –