2011-03-17 1 views
2

, 당신은 같은 헤더 파일의 여러 포함 방지 할 수 있습니다 : 나는 M4에서 같은 일을 할 수있는 방법m4 매크로 파일 include에 ifdef 가드를 어떻게 할 수 있습니까? C 헤더 파일의 경우

#ifndef MY_FOO_H 
#define MY_FOO_H 

[...] 

#endif 

을 같은 동일한 파일에 여러 include() 매크로 호출 만에 내용을 일으킬 것이다 한 번 포함 되나요?

은 특히, 내가 changequote (나는 dnl의 내 코드를 복잡하게하지 것이다) 매크로를 사용하는 것 IFDEF 가드 싶지 : 나는 다음 작업을 수행 할 때 원래

을 여러 흠도 여전히 따옴표를 손상 :

changequote_file.m4 :

ifdef(my_foo_m4,,define(my_foo_m4,1) 
changequote([,]) 
) 

changequote_invocation.m4 :

include(changequote_file.m4) 
After first include invocation: 
[I should not have brackets around me] 
`I should have normal m4 quotes around me' 
include(changequote_file.m4) 
After second include invocation: 
[I should not have brackets around me] 
`I should have normal m4 quotes around me' 

m4 changequote_invocation.m4 수율로 호출 :

After first include invocation: 
I should not have brackets around me 
`I should have normal m4 quotes around me' 


After second include invocation: 
[I should not have brackets around me] 
`I should have normal m4 quotes around me' 

답변

4

가장 간단한 방법은 cpp 버전의 거의-직역입니다 : my_foo_m4가 정의되어있는 경우

ifdef(`my_foo_m4',,`define(`my_foo_m4',1)dnl 
(rest of file here) 
')dnl 

따라서, 파일이 아무것도로 확장, 그렇지 않으면 그 내용이 평가됩니다.

+0

정상적인 상황에서 작동한다고 생각합니다. (제 질문에 답변 해 주셔서 감사합니다!). 키커는 m4가 을 해석 할 수 없기 때문에 약간의 미친 짓을하고있는 것입니다. 다음 도구는 해당 문자를 유효한 입력으로 사용하기 때문에 사용자가 다른 문자열 이스케이프를하지 않아도되기를 바랍니다. .나는'changequote' 명령을 수행하는 파일을 임포트하려고하는데,'changequote' 명령은 오직 하나의 명령 만 실행합니다. 어쨌든, 나는 또 다른 질문을 게시하고 정말로 미친 오래된 m4 해커를 준설하게 만들 것입니다. –

+0

위의 내용은 changequote 파일에서 사용하십시오. – geekosaur

+0

아, 너는 도전장을 던져 버렸다. 코드를 게시하고 당신이 그것을 황폐화시킬 수 있는지 보도록하겠습니다 :-) –

1

나는 실제로 당신에게 2 가지 질문이 있다고 생각합니다. - 그것을 수행하는 방법 - 왜 제 경우에는 효과가 없습니다. 당신이해야 있도록

당신이 한 거의 같다 할 수있는 방법,하지만 문제는 파일을 포함하는 두 번째 시간입니다 모두에게

ifdef(`my_foo_m4',,`define(`my_foo_m4',1) 
    changequote([,]) 
') 

을 인용 할 필요는 따옴표가 변경되었습니다

ifdef([my_foo_m4],,[define([my_foo_m4],1) 
    changequote([[],]) 
]) 

하지만 당신을 포함하여 : 이론적으로 다음과 같은 파일을 포함 (? 당신은 [, ]을 그들은 안 사용해야 [에 당신이 지금부터 포함 ] 그래서 모든 파일을 인용을 변경했습니다) 전자 원래 따옴표와 같은 파일 그러므로 Youw IFDEF하지 my_foo_m4 (아마도 무효 인) 기호 `my_foo_m4'에 있고 다른

define(`my_foo_m4',1) 
    changequote([,]) 

인용 (안 [] 사이) 등 평가되지 않습니다 비트 어떤 는 따옴표를 사용하지

changequote(,) 

를 호출 즉 시험의 결과는,이 ,와 changequote가 전화를 의미합니다.