2011-11-14 3 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,); 

뭔가?

미리 감사드립니다.

+0

'm4'는 C? 전처리기로 사용됩니다. 내 지식 C는 buildin 전처리기를 가지고 있지 않습니까? -) –

+0

@JensGustedt 그렇습니다. 그런데이 방법을 사용하면 다른 프로그램 프로젝트에서 같은 매크로를 재사용 할 수 있습니다. 또한 나는 그런 식으로해야한다. ... – Manos

+0

backticks/apostrophe quoting은 실제로 좋은 선택이다. 왜냐하면 backticks는 코드에 나타나기 쉽지 않기 때문이다. 결과적으로 m4를 사용하여 변경없이 소스 코드를 변환 할 수 있습니다. (물론 다른 인용 부호가 필요한 경우 m4가 허용합니다.) –

답변

2

당신은 변경 시도 할 수 :

BARRIER(Global->start, P, MyNum) 

에 : 나에게로

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

관련 문제