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

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

Cómo llamar al f (la función)? Escribir f(3) no funciona porque es reemplazado por {}funciona con el mismo nombre que una macro

+1

No es estúpido. Supongamos que tiene una macro implementando un reemplazo en línea para 'f' en su archivo de cabecera, y desea usar esta macro para definir la implementación externa en el archivo de implementación. Esta es una práctica estándar. –

+0

Es estúpido como una pregunta de entrevista. No me gustaría trabajar para una compañía que lo necesite. –

Respuesta

15

¿Funciona (f)(3);?

El preprocesador C no expande la macro f dentro de ().


+3

¿Podría explicar por qué funciona esto? –

+4

No estoy de acuerdo con que sea una tontería. Esta es una técnica que cualquier programador de C que pretenda usar el preprocesador debe saber. –

+4

@Prasoon: Su arrogancia es llamar "tonta" a la pregunta. Solo porque sepa la respuesta, no lo hace "tonto". – Nawaz

1

Una solución fue colocada por @Prasoon, otro podría ser sólo introducir otro nombre para la función, si no se puede cambiar el nombre de la función, ni el nombre de la macro:

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


#define fun (f) //braces is necessary 

#define f(a) {} 

int main() 
{ 
    fun(100); 
} 

demostración en línea : http://www.ideone.com/fbTcE

+0

'Cómo llamar a f' (¿no estamos llamando' divertido' aquí? Porque si llamar 'divertido' estaba bien, entonces podemos cambiar el nombre de la función' f() 'a' diversión() '.)) – iammilind

+0

@iammilind: diversión no es función, preprocesador lo reemplaza con 'f' (la función real). – Nawaz

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

¡Después de que undef macro se haya ido! – Nyan

+0

@Nyan, y has votado negativamente por eso :). Interlocutor no ha mencionado tal condición. Tome el caso si la macro está definida en un archivo de encabezado común y se usa en varios otros archivos. Para los archivos que no desea usar, simplemente '# undef'. – iammilind

+4

+1 para escribir una respuesta correcta que probablemente molestará al entrevistador. – Raynos

4

uso puntero de función para lograr esto:

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