2011-11-14 11 views
1

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ファイルに私はGlobal->startPは、グローバルとローカル変数MyNumある

BARRIER(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,); 

何か?

ありがとうございます。

BARRIER(Global->start, P, MyNum) 

をする:あなたが変更してみてください可能性が

+0

Cのプリプロセッサとして 'm4'?私の知る限りでは、Cにはビルドプリプロセッサはありません - ) –

+0

@JensGustedtはい私はそれを知っていますが、この方法では異なるプログラム - プロジェクトで同じマクロを再利用できます。また、私はそのようにしなければなりません。 – Manos

+0

バッククォートはコードに現われないので、バッククォート/アポストロフィの引用は実際には良い選択です。その結果、変更を加えずにm4を使用してソースコードを翻訳することがよくあります。 (もちろん、別の引用符が必要な場合は、m4で可能です。) –

答えて

2

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

私としては、私はX-Macroまたはそれのようなものを使って、M4を試してみて、避けたい:

#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

最初のアプローチが有効です!どうもありがとう! – Manos

関連する問題