2010-07-15 3 views
1

내가이 C의 ++ 파일이 (의이 main.cpp를 부르 자) :C++ 스트림에서 특정 #include 지시문을 제외하는 방법은 무엇입니까?

#include <string> 
#include "main.y.c" 
void f(const std::string& s) { 
    yy_switch_to_buffer(yy_scan_string(s.c_str())); 
    yyparse(); 
} 

파일은 bison 폴더의 유틸리티를 이용하여 사전에 생성되어야한다 main.y.c에 따라 달라집니다. 즉, 전에 bison main.y을 실행하는 것을 잊어 버리면 main.c 파일을 컴파일 할 수 없습니다. 그리고 그것은 완벽하게 OK입니다, 이것이 내가 원하는 방식입니다. 지금은이 명령을 사용하여, Makefile에서 .d 파일을 구축하기 위해 노력하고있어 :

$ c++ -MM main.c > main.d 
main.cpp:2:10: error: main.y.c: No such file or directory 

내가 여기에 실패, main.y.c 아직 준비가되지 않은 때문이다. 어떻게 든 #include 지시어를 main.c 파일에 인용해야한다고 생각하여 c++ -MM 프로세스에서 보이지 않게해야합니다.

+1

나는 'bison'을 많이 모르기 때문에 내 질문이 어리석은 일 이겠지만 ... .c 파일을 포함하는 것은 잘못된 것 같습니다. '들소'와 정말로 일하는 방법인가요? 당신은 상응하는'.h' 파일을 가지고 있지 않습니까? – ereOn

+0

네, 결과를 다른 C++ 파일로 래핑해야하는 경우 바이슨이 작동하는 방식입니다. 본질적으로 들소는 C를위한 것이지 C++을위한 것이 아닙니다. 따라서 C++ 프로젝트에서 작동하도록 만드는 것이 트릭입니다. 최소한 나는 이렇게 이해한다 .. – yegor256

+0

실제로'.h' 파일을 포함 할 수 있지만이 파일 또한'bison'에 의해 자동 생성된다. 그래서'.c'를'.h'로 바꾸면 해결되지 않을 것이다. 문제 – yegor256

답변

1

당신은 main.c 컴파일을 시도하기 전에이 bison 프로세스를 실행할 수 있습니다 있도록 main.cmain.y.c에 의존하여 메이크에 표시 할 수 있습니다.

대안으로 (나는 아마도 당신이 무엇을하고 싶은지 아닌지)는 makefile이 매크로를 컴파일러에 전달하여 main.y.c이 있는지 여부를 나타내며 #if 지시어를 사용하여 포함 시키거나 포함하지 않을 수 있습니다) main.y.c.

#if EXISTS_MAIN_Y_C 
#include "main.y.c" 
#endif 
+0

매크로 문제가 실제 문제를 숨기지 않습니까? 파일이 생성되었지만 어쨌든 필요하지 않은 경우 파일을 포함시키지 않으면 실제 문제가 덜 명확 해집니다. – ereOn

+0

@ereOn : 왜 나는 그것이 아마도 좋은 해결책이 아니라고 말한 것입니다. 아마 그것을 추가해서는 안됩니다 ... 때로는 플랫폼에있을 수도 있고 없을 수도있는 헤더를 조건부로 포함하고자 할 수도 있습니다. 이 경우 누락 된 플랫폼 기능의 사용자 지정 구현이 포함 된 코드를 조건부로 포함 할 수 있습니다. autoconf는 일반적으로이 작업을 수행 할 수있는 매크로를 설정하는 데 사용되지만 실제로는이 사용자가 필요로하는 것이 아닙니다. –

3

이것은 메이크 파일의 작업처럼 들립니다. main.cmain.y.c에 종속되도록 종속성을 설정할 수 있으며 main.y.c에는 bison 코드에서 빌드하는 규칙이 있습니다.

관련 문제