2011-08-11 25 views
8

Estoy estudiando un fragmento de código de las bibliotecas de GSL y me he quedado desconcertado con algunas líneas al principio de un archivo de encabezado. Entiendo lo que hacen #undef, #ifdef y etc., pero lo que no entiendo es ¿por qué básicamente restablecieron la definición de _BEGIN_DECLS y luego continuar y definirla de nuevo? Técnicamente, no debería haber definiciones previas, ¿verdad? Quiero decir, esas cosas son estáticas y no están sujetas a cambios. De todos modos, aquí está el extracto del código:Uso de #undef en C++

#undef __BEGIN_DECLS 
    #undef __END_DECLS 
    #ifdef __cplusplus 
    # define __BEGIN_DECLS extern "C" { 
    # define __END_DECLS } 
    #else 
    # define __BEGIN_DECLS /* empty */ 
    # define __END_DECLS /* empty */ 
    #endif 
+6

¿Por qué el voto a favor? Me parece una pregunta razonable. –

Respuesta

10

No se le permite a #define una macro que ya está definido a menos que las listas de parámetros y listas de reemplazo son idénticos.

Si __BEGIN_DECLS se definió previamente para ser reemplazado por algo distinto de extern "C" {, la #define __BEGIN_DECLS extern "C" { no sería válida y el programa sería poco formada.

Técnicamente, no debería haber ninguna definición previa, ¿verdad?

Podría haber sido, seguro.

+0

Gracias James, tiene sentido. No pensé en otras posibles definiciones de _BEGIN_DECLS para otros fines. – GKED

+0

Especialmente porque los identificadores con doble guión bajo están reservados para la implementación. –

2

No realmente. Si otra biblioteca a la que está llamando utiliza el mismo nombre, eso ya estaría definido.

Por lo tanto, como no puede definirlo sobre otra definición, primero llama al #undef y luego al #define.

A veces es apropiado usar #ifdef o #ifndef.