2010-06-07 18 views
0

Compte tenu de la structure suivante:préprocesseur récupération des données macro

struct nmslist_elem_s { 
    nmptr data; 
    struct nmslist_elem_s *next; 
}; 
typedef struct nmslist_elem_s nmslist_elem; 

Où:

typedef void* nmptr; 

Est-il possible d'écrire une macro qui récupère les données de l'élément et de le jeter au bon type:

MACRO(type, element) qui s'étend à *((type*)element->data). Par exemple pour int, j'aurais besoin de quelque chose comme ceci: *((int*)(element->data)).

Édition ultérieure: Oui, ils fonctionnent, je "mangeais" certains "(" et ")". Cela fonctionne:

#define NMSLIST_DATA(type,elem) (*((type*)((elem)->data))) 
#define NMSLIST_DATA_REF(type,elem) ((type*)((elem)->data)) 
+4

Quel est le problème avec '#define get_data (type, élément) * ((type *) element-> données)'? Est-ce que je manque quelque chose? – sbi

+0

@sbi parenthèses autour de 'element'? –

+0

@Pete: Ah, ouais. (Je suis un programmeur C++ ...) – sbi

Répondre

2
#define RETRIEVE(type, element) *((type*)((element)->data)) 

RETRIEVE(int, nmptr) 
// expands to 
*((int*)((nmptr)->data)) 

(non testé, mais il devrait fonctionner)

+0

Confirmé, cela ne fonctionne pas. – VeeArr