Pages vues depuis 25/07/2007 : 26 301 622
Index du forum »» Création-Développement »» Les macros et le langage C
Hello
Suite à conversation que j'ai eu avec HunoPPC hier
Je réalise que les programmeurs C n'ont pas toujours comme moi le réflexe d'utiliser des macros partout dans leurs sources
Pourtant les macros simplifient la vie :-)
En voici qques unes que j'utilise très souvent
Un macro en C est un peu comme un raccourci clavier : c'est comme si vous aviez tapé le code à cet endroit mais écrit en "raccourci"
Je veux dire ce n'est pas un "sous programme" mais juste le compilateur qui fera un chercher/remplacer et remplacera au final votre "jargon"
par des instructions C standards
Exemple
#define HELLOWORLD printf("Hello World\n")
Après si vous tapez
HELLOWORLD;
HELLOWORLD;
HELLOWORLD;
dans votre code alors ils seront remplacés par les printf correspondant
Dès lors que vous utilisez plusieurs fois un truc dans une expression vous avez des "chances" de faire une erreur de saisie : par exemple les classiques
for(x=0;x
printf("x:%ld\n",x);
y a t'il bien x marqué partout ? combien de fois on se trompe lors de copier/coller malencontreux...
REM me sert afficher du texte
LL LLL LLL à afficher les numeros de lignes : en cas de plantage faire préceder ses lignes de LL et obtenir ainsi la dernière ligne qui marche
ici OSAlert() affiche un requesteur texte à cliquer LLLL le met dans une variable globale ainsi en cas de plantage (GRIM) on retrouve cette valeur dans un registre
VAR VARF VARS VARP le contenu d'une variable int,float,string,pointeur
et ou AND OR me permettent de bien différencier les AND/OR binaires des et/ou servant aux conditions
MYCLR vide une structure
NLOOP fait une boucle
MYNEW MYNEWLIST alloue une structure, une list
CHECK RCHECK verifie un pointeur sinon return ou return(null)
COPYV copie des vecteurs x y z
INFO INFO2 à tester des valeurs
INFO(action,GML_ac_move_direction )
INFO(action,GML_ac_move_free )
INFO(action,GML_ac_move_towards_point )
INFO(action,GML_ac_set_hspeed )
SWAP à permuter deux variables quelconques
LIBOPEN LIBOPEN4 LIBCLOSE LIBCLOSE4 à ouvrir/fermer les libraries proprement :
BOOL OpenAmigaLibraries(void)
{
LIBOPEN(DOSBase,dos.library,36L)
LIBOPEN(GfxBase,graphics.library,0L)
LIBOPEN4(IDOS,DOSBase)
LIBOPEN4(IGraphics,GfxBase)
return(TRUE);
}
void CloseAmigaLibraries()
{
LIBCLOSE4(IDOS)
LIBCLOSE4(IGraphics)
LIBCLOSE(DOSBase)
LIBCLOSE(GfxBase)
}
A noter aussi que vous pouvez faire des macros "conditionnelles" qui n'apparaitront que dans certaines versions de vos binaires genre :
#ifdef DEBUGVERSION
#define REM(message) if(debug) {printf(#message"\n");}
#define VAR(var) if(debug) {printf(" " #var "=" ); printf("%ld;\n", ((ULONG)var) );}
#else
#define REM(message) ;
#define VAR(var) ;
#endif
/*==================================================================*/
UBYTE debugtext[256];
UBYTE tmpname[256];
ULONG LLnum=0;
/*==================================================================*/
ULONG asmline=0;
#define REM(message) if(debug) {printf(#message"\n");}
#define STEP(tex) {OSAlert(#tex);}
#define ZZ {if(debug) OSAlert("OK");}
#define LL {printf("Line:%ld %ld\n",(LONG)__LINE__,(LONG)LLnum++);}
#define LLL {LL ; OSAlert("OK");}
#define LLLL { asmline= __LINE__ ; printf("Line:%ld\n",asmline); }
#define VAR(var) if(debug) {printf(" " #var "=" ); printf("%ld;\n", ((ULONG)var) );}
#define VARF(var) if(debug) {printf(" " #var "=" ); printf("%2.2f;\n", var) );}
#define VARS(var) if(debug) {printf(" " #var "=<%s>;\n",var); }
#define VARP(var) if(debug) {if(var!=0) {printf(" " #var "=" ); printf("%ld;\n", ((ULONG)var) );} else {printf(" " #var "=NULL;\n");}}
#define PP(var) {if(debug) printf(#var ": \t\t\t\t\t%ld \t bytes \t(%ld aligned) \n", sizeof(var) , sizeof(var)%4 );}
#define et &&
#define ou ||
#define AND &
#define OR |
#define MYCLR(x) memset(&x,0,sizeof(x));
#define NLOOP(nbre) for(n=0;n
#define MYNEWLIST(obj,nb) (struct obj*)malloc(sizeof(struct obj)*nb,#obj); if(debug) printf(#obj " nb:%ld\n",nb);
#define RCHECK(obj) if(obj==NULL) return(NULL);
#define CHECK(obj) if(obj==NULL) return;
#define COPYV(a,b) { (a)->x=(b)->x; (a)->y=(b)->y; (a)->s=(b)->s; (a)->t=(b)->t; (a)->w=(b)->w; }
#define INFO(var,const) if(debug) if(var==const) {printf(" [" #const "]\n"); }
#define INFO2(var,const) if(debug) if(var==const) {printf(" [" #const "]\n"); }
#define SWAP(x,y) {temp=x;x=y;y=temp;}
/*==================================================================*/
#define LIBCLOSE(libbase) if(libbase!=NULL) {CloseLibrary( (struct Library *)libbase ); libbase=NULL; }
#define LIBOPEN(libbase,name,version) libbase =(void*)OpenLibrary(#name,version); if(libbase==NULL) return(FALSE);
#ifdef OS4
#define LIBOPEN4(interface,libbase) interface=(void*)GetInterface((struct Library *)libbase, "main", 1, NULL); if(interface==NULL) return(FALSE);
#define LIBCLOSE4(interface) if(interface!=NULL) {DropInterface((struct Interface*)interface );interface=NULL;}
#else
#define LIBOPEN4(interface,libbase) ;
#define LIBCLOSE4(interface) ;
#endif
/*==================================================================*/