2011-11-14 2 views
1

J'ai un problème avec une macro m4. La macro estm4 n'analyse pas les variables locales

define(BARRIER, ` 
#if defined USE_PTHREAD_BARRIERS 
barrier_wait(&$1,$2,$3); 
#elif defined (USE_CENTRALIZED_BARRIERS) 
central_barrier(&$1,$2,$3); 
#endif 
') 

et dans mon fichier .c j'ai

BARRIER(Global->start, P, MyNum)Global->start et P sont globals et MyNum une variable locale.

Mais quand j'exécute

m4 macrosfile.m4 sourcefile > outputfile 

dans le fichier de sortie il y a ceci:

#if defined USE_PTHREAD_BARRIERS 
barrier_wait(&Global->start,P,); 
#elif defined (USE_CENTRALIZED_BARRIERS) 
central_barrier(&Global->start,P,); 

Quelque chose ne va pas avec ma macro, ou tout simplement une limitation?

Merci d'avance.

+0

'm4' en tant que préprocesseur de C? À ma connaissance C a un pré-processeur buildin non? -) –

+0

@JensGustedt oui Je sais que, mais de cette façon l'utilisation peut réutiliser les mêmes macros dans différents programmes-projets. Aussi, je suis obligé de faire de cette façon ... – Manos

+0

Les guillemets backticks/apostrophe sont en fait un bon choix, puisque les guillemets ne sont pas susceptibles d'apparaître dans le code. Par conséquent, vous pouvez souvent utiliser m4 pour traduire le code source sans modifications. (Et bien sûr, si vous avez besoin d'un caractère de citation différent, m4 le permet.) –

Répondre

2

Vous pouvez essayer de changer:

BARRIER(Global->start, P, MyNum) 

à:

BARRIER(`Global->start', `P', `MyNum') 

Quant à moi, je vais essayer et éviter m4 en utilisant un X-Macro ou quelque chose comme ça:

#if defined USE_PTHREAD_BARRIERS 
#define BARRIER_X(x_, y_, z_) barrier_wait(&x_, y_, z_) 
#elif defined (USE_CENTRALIZED_BARRIERS) 
#define BARRIER_X(x_, y_, z_) central_barrier(&x_, y_, z_) 
#endif 

...

BARRIER_X(Global->start, P, MyNum); 
+0

Votre première approche a fonctionné! Merci beaucoup! – Manos