J'ai défini 2 macros:Aide avec 2 macros C
#define HCL_CLASS(TYPE) typedef struct TYPE { \
HCLUInt rc; \
void (*dealloc)(TYPE*);
#define HCL_CLASS_END(TYPE) } TYPE; \
TYPE * TYPE##Alloc() { TYPE *ptr = (TYPE *)malloc(sizeof(TYPE)); if (ptr != NULL) ptr->rc = 1; return ptr; }
Le but de ces macros est de créer une struct C avec une fonction membres prédéfinis (conserver le nombre et deallocator) et créer automatiquement une fonction allocateur .
Maintenant, quand j'utilise ces macros comme ceci:
HCL_CLASS(Dummy)
int whatever;
HCL_CLASS_END(Dummy)
ils s'étendus dans ce (pris directement à partir XCode):
typedef struct Dummy { HCLUInt rc; void (*dealloc)(Dummy*);
int whatever;
} Dummy; Dummy * DummyAlloc() { Dummy *ptr = (Dummy *)malloc(sizeof(Dummy)); if (ptr != ((void *)0)) ptr->rc = 1; return ptr; }
Et quand je tente de compiler, je reçois deux erreurs:
- "Expected ')' avant '*' jeton" en ligne qui appelle HCL_CLASS
- "Expected"; ' avant 'int' "on line qui déclare le membre int struct
Je ne vois pas de raison pour ces erreurs. Je serais reconnaissant si vous m'aidiez à le trouver. Merci.
Juste un type de style général, ne pas lancer malloc(). Cela peut cacher des problèmes potentiels en le faisant. Par exemple, supposons que vous oubliez d'inclure stdlib.h, donc malloc() est supposé renvoyer int. Si sizeof (int) et sizeof (Dummy) n'ont pas la même taille, vous pouvez imaginer la casse qui s'ensuivra. Le seul moment que vous auriez à lancer est si vous mélangez avec C++ où ne pas le faire se traduira par une erreur. C est parfaitement heureux sans la distribution, puisque malloc renvoie un pointeur vers quelque chose, pas n'importe quoi en particulier. – jer
vous voulez dire sizeof (Dummy *) mais je vous +1 pour être correct en général. –
Oui je le fais, la touche n'a pas enfoncé, mon erreur :) – jer