2011-05-21 28 views
16
#include<stdio.h> 
void f(int a) 
{ 
printf("%d", a); 
} 
#define f(a) {} 

int main() 
{ 
/* call f : function */ 
} 

Come chiamare f (la funzione)? La scrittura f(3) non funziona perché è sostituita da {}con lo stesso nome di una macro

+1

Non stupido. Supponiamo di avere una macro che implementa una sostituzione in linea per 'f' nel suo file di intestazione e si desidera utilizzare questa macro per definire l'implementazione esterna nel file di implementazione. Questa è una pratica standard. –

+0

È una domanda stupida come intervista. Non vorrei lavorare per un'azienda che ha bisogno di questo. –

risposta

15

(f)(3); funziona?

Il preprocessore C non espande la macro f all'interno di ().


+3

Puoi spiegare perché funziona? –

+4

Non sono d'accordo che sia sciocco. Questa è una tecnica che dovrebbe essere conosciuta da ogni programmatore C che intende usare il preprocessore. –

+4

@Prasoon: La sua arroganza per chiamare la domanda "sciocca". Solo perché conosci la risposta, non rende "stupido". – Nawaz

1

Una soluzione è pubblicato da @Prasoon, un altro potrebbe essere solo l'introduzione di un altro nome per la funzione, se non è possibile modificare il nome della funzione, né il nome della macro:

#include<stdio.h> 
void f(int a) 
{ 
    printf("%d", a); 
} 


#define fun (f) //braces is necessary 

#define f(a) {} 

int main() 
{ 
    fun(100); 
} 

Demo in linea : http://www.ideone.com/fbTcE

+0

'Come chiamare f' (non stiamo chiamando' fun' qui? Perché se chiamare 'fun' era ok allora possiamo cambiare il nome della funzione' f() 'a' fun() '.:)) – iammilind

+0

@iammilind: il divertimento non è funzione, il preprocessore lo sostituisce con 'f' (la funzione effettiva). – Nawaz

7
int main() 
{ 
#undef f // clear f! 
f(3); 
} 
+1

Dopo la macro undef è andata! – Nyan

+0

@Nyan e hai downvoted per quello :). L'interrogante non ha menzionato tale condizione. Prendi il caso se la macro è definita in un file di intestazione comune e viene utilizzata in molti altri file. Per i file che non vuoi usare, dovrai semplicemente "# undef". – iammilind

+4

+1 per scrivere una risposta corretta che probabilmente infastidirà l'intervistatore! – Raynos

4

Usa puntatore a funzione per raggiungere questo obiettivo:

int main() { 
    void (*p)(int a); 
    p = f; 
    p(3); //--> will call f(3) 
    return 0; 
} 
Problemi correlati