2012-10-02 37 views
7

Dentro de las fuentes del núcleo de Linux veo que, dentro de las enumeraciones, también hay una definición con el mismo nombre del elemento enum. Ejemplo de linux/rtnetlink.h tenemos:define dentro de la enumeración

enum { 
     RTM_BASE  = 16, 
#define RTM_BASE  RTM_BASE 

     RTM_NEWLINK  = 16, 
#define RTM_NEWLINK  RTM_NEWLINK 
     RTM_DELLINK, 
#define RTM_DELLINK  RTM_DELLINK 
... 

¿Cuál es la razón de esto? No puedo entender cómo se usa esto.

Gracias

Respuesta

2

Otra suposición: esta macro podría permitir cambiar el nombre de una entrada de la enumeración sin romper otro código. Cambiar

enum { 
     RTM_BASE  = 16, 
#define RTM_BASE  RTM_BASE 

a

enum { 
     RTM_BASE_NEW_NEW_NEW  = 16, 
#define RTM_BASE  RTM_BASE_NEW_NEW_NEW 

Un usuario todavía podría utilizar RTM_BASE.

+0

'RTM_BASE = RTM_BASE_NEW_NEW_NEW' funcionaría igual de bien, sin la definición. –

5

Una cosa que podía pensar es que se puede comprobar el existencia de la enumeración a través de la macro:

#ifdef RTM_BASE 
int flag = RTMBASE; 
#else 
int flag = 0; 
#endif 

Ni idea de si eso es lo que está pasando, aunque.

+0

Sí, eso es exactamente lo que iba a escribir después de terminar mi sándwich. Es el único propósito que puedo ver que realmente sirve –

+0

¡Práctico! Pero mirando las fuentes, parece que define no se utilizan de esta manera. Gracias. – MirkoBanchi

+1

No tendría sentido hacer esto en las fuentes del kernel, pero tiene sentido en las aplicaciones de espacio de usuario que podrían necesitar trabajar en múltiples versiones de kernel, donde las capacidades pueden o no estar presentes. –

3

Otra cosa que estos #define s logran, además de permitir que el código viejo continúe con los nombres antiguos, si cambian los nombres enum, y verificando si están definidos, es evitar que otros códigos definan estos símbolos.

#include <linux/rtnetlink.h> 
// for some reason, the author thinks 
#define RTM_BASE 17.3f 
// is a good idea 

no compilaría.

+0

Esta respuesta es, en mi opinión, la correcta. Las otras 2 respuestas me parecen bastante artificiales. Éste tiene el potencial de descubrir conflictos de nombre reales, difíciles de encontrar, que son bastante fáciles de hacer. –

Cuestiones relacionadas