2009-11-17 2 views
14

C 전처리 기가 함수 (매크로가 아님)가 선언되었는지 여부를 확인할 수 있습니까? 나는 다음을 시도했지만 작동 표시되지 않습니다함수가 C 전 처리기로 선언되었는지 확인 하시겠습니까?

#include <stdio.h> 

int main(void) 
{ 
#if defined(printf) 
    printf("You support printf!\n"); 
#else 
    puts("Either you don't support printf, or this test doesn't work."); 
#endif 
    return 0; 
} 
+0

저는이 이유에 대해 매우 흥미가 있습니다. 작업하고있는 libs는 일관성이 있어야합니다. 예를 들어 보겠습니다. printf가없는 stdio.h가 없으며 먼 미래에 printf가 제거 될 수도 있습니다. 이제 대체 방법에 대해 알지 못할 것입니다. 호출 될 – flokra

+0

필자는 printf가 아닌 모든 함수 이름을 생각하고 있습니다. 하지만, 거기에 함수가 있는지 알고 싶다면 그냥 컴파일러 오류로 알 수 있습니다 :-) – paxdiablo

+5

필자의 주요 인센티브는 bcopy() 또는 arc4random()과 같은 함수를 검사하는 것입니다 (크로스 플랫폼 프로그램을 작성할 때) , 항상 정의되지는 않습니다. – Michael

답변

21

호 처리기는 C 컴파일러와 C 컴파일러 프로세스의 함수 선언하기 전에 실행됩니다. 전 처리기는 텍스트 처리에만 사용됩니다.

그러나 대부분의 헤더 파일에는 전 처리기 단계에서 테스트 할 수있는 _STDIO_H_과 같은 보호 매크로가 포함되어 있습니다. 그러나 포함 보호 매크로 이름이 표준화되지 않았으므로 해당 솔루션은 이식 가능하지 않습니다.

0

전처리 기가 C/C++ 언어를 인식하지 못하기 때문에 (실제로는 텍스트 대체 만 수행함) 나는 이것이 가능하지 않다고 추측합니다. 왜 이걸하고 싶어? 어쩌면 또 다른 방법이있을 것입니다.

1

전처리 기는 간단한 프로그램으로 기본 언어에 대해 아무 것도 알지 못합니다. 함수가 선언되었는지는 알 수 없습니다. 가능하다해도이 함수는 다른 라이브러리에서 정의 될 수 있으며 심볼이 링크 중에 해결되므로 전처리 기는 그러한 측면에서 도움이되지 못합니다.

5

autoconf와 같은 도구를 보면 많은 테스트를 거쳐 컴퓨터에 있거나 가지고 있지 않은 것을 확인하고 제대로 컴파일 한 다음 정확한 #DEFINES를 설정하는 것을 볼 수 있습니다.

당신이 유닉스 환경에 있다면 그 모델과 그 도구를 보길 원할 것입니다. 당신이하고 싶은 것은 불가능할 것입니다. 틀림없이 다른 사람들이 지적하고 있기 때문입니다.

관련 문제