2013-03-27 16 views
5

La mia domanda è: Se si ha una macro e una funzione con lo stesso nome, solo la macro verrebbe invocata, giusto? Cosa succede se voglio richiamare la funzione al posto della macro?Invoke function invece di macro in C

risposta

12

Se si dispone di una funzione e una funzione simile a macro entrambe di nome foo e vogliono richiamare la versione della funzione, si può fare:

(foo)(args) 

Questo funziona perché i nomi delle macro funzioni simili devono essere seguiti da un elenco di argomenti tra parentesi per la sostituzione.

Questo è citata al punto 7.1.4/1 della norma ISO C99:

Qualsiasi funzione dichiarata in un'intestazione può essere inoltre implementata come macro funzione simile definita nell'intestazione, quindi se un la funzione di libreria viene dichiarata esplicitamente quando viene inclusa la relativa intestazione, è possibile utilizzare una delle tecniche illustrate di seguito per garantire che la dichiarazione non sia influenzata da tale macro. Qualsiasi definizione di macro di una funzione può essere soppressa localmente racchiudendo il nome della funzione tra parentesi, poiché il nome non è seguito dalla parentesi sinistra che indica l'espansione di un nome di funzione macro. Per lo stesso motivo sintattico, è consentito prendere l'indirizzo di una funzione di libreria anche se è anche definito come macro. L'uso di #undef per rimuovere qualsiasi definizione di macro garantirà anche che venga riferita una funzione effettiva.

Se è necessario, tuttavia, è consigliabile aggiungere commenti al codice per spiegarlo poiché sembra un po 'strano e non è una pratica comune. Se possibile, rinominare la funzione per evitare la collisione del nome potrebbe essere più gestibile a lungo termine.

+0

Nota a margine, la situazione in C++ è esattamente la stessa. – Potatoswatter

+0

Sì, l'approccio della domanda originale puzza di orrori della manutenzione a valle. Se deve, però, questo è il modo. –

1

Rinominare uno dei due. Oppure, se ciò non è possibile, rendere un puntatore alla funzione originale prima di definire la macro e chiamare la funzione tramite quel puntatore.

+0

La macro non interferirà con l'assunzione di tale indirizzo la funzione. 'pippo' e' & pippo' non causeranno invocazioni di macro simili a funzioni. Questa è la soluzione corretta per le macro a oggetti, però. – Potatoswatter

1

Fornire trucco prima chiamata

#ifdef foo 
#undef foo 
#endif // 

Quindi, a livello locale in fila indiana che invoca la funzione si avrà sempre un comportamento esplicito

+1

Ma non c'è modo di eseguire il backup e il ripristino di una macro, quindi non devi mai usarla dopo la chiamata alla funzione. – Potatoswatter