2011-07-26 8 views
5

He detectado algo en C archivos de encabezado lo que no sé para qué sirve. Por ejemplo, en el archivo bits/socket.h hay una enumeración tipo enum __socket_type, pero después de cada enumerador hay una macro definida que define la misma. Ejemplo:Redefiniendo enumeradores de enumeración con #define

enum __socket_type 
{ 
    SOCK_STREAM = 1, 
    #define SOCK_STREAM SOCK_STREAM 
    ... 
}; 

No he podido averiguar para qué sirve. Por favor iluminame. Ni siquiera sé cómo formar la pregunta correcta para consultar google ni este cuadro de búsqueda del sitio.

Respuesta

4

Una macro preprocesador nunca se expandirá recursivamente, por lo que #define hace es dejar el nombre en su lugar donde quiera que se use. Tales cosas son útiles cuando quiere tener una prueba de características del preprocesador.

#ifdef SOCK_STREAM 
.. 
#endif 

se pueden utilizar para compilar posteriormente algunos códigos de forma condicional.

Editar: Esto combina el enfoque más limpio de enumeraciones (valores implícitos sin colisiones y alcance) con pruebas de preprocesador.

+0

de hecho, esto tiene sentido, pero ¿por qué también hay enumeraciones no solo define? – BeginEnd

+0

@BeginEnd, vea mi edición –

+0

. Tenía miedo de que dijera esto. : P Hacer tales cosas "universales" a menudo hace que mi programación sea más difícil ... – BeginEnd

5

Lo único que ocurre es porque la gente ve una constante en todas las tapas, dicen NUM_FILES, pensarán que es una macro y están tentados a escribir esto:

#ifdef NUM_FILES 

Ahora Normalmente esto fallar, pero si escribe #define NUM_FILES NUM_FILES se comporta como una macro para el preprocesador y los IDE y como una enumeración para el código mismo.

0

Sospecho que es para IDEs u otras herramientas para entender que un símbolo se define de alguna manera.

Cuestiones relacionadas