2013-12-12 1 views
-1

입니다. 표준 헤더 파일을 읽는다면 아마도 외부 함수 선언을 볼 수있을 것입니다. 하지만 그 헤더 파일의 헤더에서 기능의 전체 본문을 찾을 수 없습니다. 아무도 언급 된 기능의 완전한 정의가 어디 있는지 말해 줄 수 있습니다. pthread.h 헤더 파일 여기서 헤더 파일의 외부 함수 정의는

extern int pthread_create (pthread_t *__restrict __newthread, 
       __const pthread_attr_t *__restrict __attr, 
       void *(*__start_routine) (void *), 
       void *__restrict __arg) __THROWNL __nonnull ((1, 3)); 

만약 그렇다면 함수의 본문을 찾을 수 어쨌든이이 기능을 라이브러리 오브젝트 파일로 연결됩니다 정의를 통해

:이 예는?

+1

정의는 pthreads 라이브러리에 있습니다. – suspectus

답변

4

이 기능을 사용하지 못할 수도 있습니다. 사람들은 소스 코드에 C 헤더를 제공 할 필요가 없습니다. 예를 들어, Windows에서는 함수 정의를 DLL로 작성하고 소스 코드를 제공하지 않는 것이 일반적입니다. 예를 들어 Microsoft는 대부분의 Windows 내부 소스 코드를 기밀로 간주합니다.

Linux에서는 일반적으로 소스 코드를 사용할 수 있지만 주어진 헤더를 소스 코드에 매핑하는 쉬운 방법은 없습니다.

귀하의 리눅스 배포판에는 도움이되는 도구가있을 수 있습니다. Ubuntu와 Debian의 apt-get source 명령과 RPM 기반 배포판의 yumdownloader --source 명령은 대부분의 시스템 패키지와 관련된 소스를 찾을 수 있습니다.

+0

라이브러리 객체는 바이너리 임원이므로 프로그램 함수 호출이 함수 본문에 연결되는 방법을 알고 싶습니다. 링커 프로그램 링크가 함수 프로토 타입을 객체 본문에 연결하는 방법을 의미합니다. . 함수 이름에 따라 특수 패턴을 검색합니까? 고맙습니다. – muradin

+1

@muradin : 물론 그렇습니다. C 프로그램에서 사용한 모든 외부 함수는 이름으로 만 인식 할 수 있습니다. 링커에 제공 한 모든 것입니다! (그리고 같은 이름을 두 번 사용할 수 없다는 것을 이미 알고있을 것입니다.) * a * 라이브러리 형식의 예는 f.e를보십시오. http://www.microsoft.com/msj/0498/hood0498.aspx – usr2564301

0

우선, 왜 #include- 헤더 파일인지 알아보십시오. 주된 이유는 실제 정의가 발생하기 전에 프로토 타입을 선언하기 위해서입니다. 그래서 헤더 파일은 파일의 맨 앞에 포함되어 있기 때문에 .c 파일의 함수에서 (가능한) 호출 전에 함수 선언이 나타납니다.

헤더 파일에서 함수 또는 변수를 정의하는 것을 결코 생각해 본적이 없습니다. 실수로 헤더 파일을 두 번 포함하면 재정의 오류가 발생합니다. 그래서 선언문들만 존재합니다.

적절한 함수에 대한 정의는 소스와 링크하여 최종 이진 파일을 만드는 라이브러리 (공유 또는 정적)에있을 가능성이 큽니다. 해당 라이브러리 코드를 검색하십시오.