m4 не анализирует локальные переменные

У меня проблема с макросом m4. Макрос

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

и в моем файле .C у меня есть

BARRIER(Global->start, P, MyNum), где Global->start и P — глобальные, а MyNum — локальная переменная.

Но когда я выполняю

m4 macrosfile.m4 sourcefile > outputfile

в выходном файле есть это:

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

Что-то не так с моим макросом или просто ограничение?

Заранее спасибо.


c m4
person Manos    schedule 14.11.2011    source источник
comment
m4 в качестве препроцессора для C? Насколько мне известно, C не имеет встроенного препроцессора?-)   -  person Jens Gustedt    schedule 15.11.2011
comment
@JensGustedt да, я знаю это, но таким образом можно повторно использовать одни и те же макросы в разных программах-проектах. Я тоже вынужден так поступить...   -  person Manos    schedule 15.11.2011
comment
Обратные кавычки/апострофы на самом деле являются хорошим выбором, так как обратные кавычки вряд ли появятся в коде. В результате вы часто можете использовать m4 для перевода исходного кода без каких-либо изменений. (И, конечно же, если вам нужен другой символ кавычек, m4 это позволяет.)   -  person William Pursell    schedule 24.03.2012


Ответы (1)


Вы можете попробовать изменить:

BARRIER(Global->start, P, MyNum)

to:

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

Что касается меня, я бы попытался избежать m4, используя X-Macro или что-то подобное :

#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);
person ldav1s    schedule 14.11.2011