2012-02-22 1 views
8

C 특정 헤더 파일이 필요한 파일이 있습니다. 해당 헤더 파일이 없으면 전 처리기에서 특정 경고를 발행합니다. 같은 뭔가 :C 전처리 기가 헤더 파일을 찾을 수없고 특정 경고를 발행 할 수 있는지 감지 할 수 있습니까?

#if !(#include <special.h>) 
#warning "Don't worry, you can fix this." 
#warning "You just need to update this other repo over here:" 
#endif 

이는 C 전처리와 함께 할 수 있습니까?

+0

메이크 파일 파일에서 가능합니다. –

+2

보통'./configure' 스크립트로 할 수 있습니다. –

+0

가능한 [C 처리기를 사용하여 파일이 있는지 알려줄 수 있습니까?] (http://stackoverflow.com/questions/142877/can-the-c) -preprocessor-be-tell-if-a-file-exists) –

답변

9

#define X 매크로가 포함 된 파일 인 경우 당신은 항상 확인할 수 있습니다은 ... 정의 :

+1

그리고 어떻게 도움이 될까요? – asaelr

+0

@asaelr 이것이 모두에게 맞는 것인지 확실하지 않지만, 인클루드 파일을 찾을 수 없다면 내 빌드 설정에서 PP/CC가 용감하게 누를 것입니다. 그래서'#include '다음에'#ifndef __SPECIAL_H__'이 나와서 –

7

아니,이 수 없습니다. #include 헤더 만 시도하면됩니다. 존재하지 않으면 컴파일러에서 오류를 표시합니다.

GNU autoconf과 같은 도구를 사용하는 것이 좋습니다. autoconf는 빌드 시스템을 분석하고 특정 헤더 파일의 설치 여부와 같은 사항을 결정하고 해당 정보를 나타내는 매크로로 구성된 헤더 파일을 생성하는 configure이라는 쉘 스크립트를 생성합니다.

예를 들어, 빌드 시스템은 헤더 <sys/time.h>가 포함되어있는 경우는 HAVE_SYS_TIME_H을 정의 할 수 있습니다, 그래서 같은 당신은 코드를 작성할 수 있습니다 : 당신이 필요로하는 모든 경고 인 경우

#if HAVE_SYS_TIME_H 
#include <sys/time.h> 
#else 
#warning "Don't worry, you can fix this." 
#endif 
+1

yepp 일하지만, configure 스크립트에서 경고/오류를내는 것이 더 합리적입니다 ... –

-3

헤더 파일이없는 것을 (그리고 커스텀 코드가 없다면) 대부분의 컴파일러는 이미 당신에게 하나를 줄 것이다.

$ LC_MESSAGES=en_US gcc -c bar.c 
bar.c:1:17: fatal error: foo.h: No such file or directory 
compilation terminated. 
+6

따라서 치명적인 오류와 경고는 너에게 똑같은 거지, 그렇지? –

12

나는 이것이 오래된 질문이라는 것을 알고있다. 그러나 나는 이것을 할 방법이 필요했고 나는이 대답을 읽을 때 실망했다. clang은 여러분이 필요로하는 것을 완벽하게 작동시키는 멋진 __has_include("header name") 지시어를 가지고 있습니다. #if defined(__has_include)

+5

[gcc도 가지고 있습니다] (https://gcc.gnu.org/gcc-5/changes.html). 그것은 gcc 5,하지만 4.9 나를 위해 잘 작동하는 것 같다. –

관련 문제