아주 오래 전에 경험한 것이라 기억이 정확하지 않습니다만, 예전에 PC에서 Turbo-C로 프로그램을 작성할 때 엉뚱한 일로 고생한 적이 있습니다. 수학 함수를 사용한 결과 값이 계속 엉뚱한 값으로 계산되는 것이었죠. 변수 타입을 변경하기도 하고 값을 직접 대입하면서 확인해 보았지만 너무 당연한 계산 결과 값이 완전히 엉뚱한 값으로 계산이 되는 것이었습니다.

헤더파일 추가를 철처히

한참 고생한 후에 알았는데, 삼감함수에 대한 헤더파일을 include 하지 않은 것이 원인이있습니다. C에서는 함수로 인수를 전달할 때, 함수에 대한 정보를 미리 컴파일러에 알려 주지 않으면 인수의 변수 타입을 모두 int 로 받도록 컴파일이 되기 때문입니다.

지금의 gcc 는 많이 영리해져서 이런 경우는 적은 것으로 생각됩니다만 그래도 사용하는 함수에 대한 정확한 정보를 컴파일러에 알려 주는 것이 좋습니다.

헤더파일을 알려면

  1. man 을 이용하는 방법

예로 memcmp() 함수에 대한 헤더파일을 찾아 보겠습니다. 메뉴얼에 찾는 것이 좋겠습니다만, 책꽂이까지 가시기 귀찬으시다면 리눅스 터미널에서 man 명령을 이용하시면 됩니다.

]$ man memcmp
MEMCMP(P)

NAME
       memcmp - compare bytes in memory

SYNOPSIS
       #include 

       int memcmp(const void *s1, const void *s2, size_t n)
  1. Falinux Forum 의 C 라이브러리 함수 이용

그러나 sleep 함수처럼 헤더파일이 출력되지 않는 함수도 있습니다. 이럴 때에는 Falinux Forum 의 C 라이브러리 함수에서 함수 이름을 검색하시면 헤더파일을 찾으실 수 있습니다.

  1. grep를 이용

그러나 제가 게을러서 FF의 C 라이브러리 함수에 아직 등록하지 못한 함수가 있을 수 있습니다. 이럴 때에는 시간이 조금 걸려도 확실하게 찾아 주는 방법을 이용합니다. 바로 grep 명령을 사용하는 것인데요, 보통 C 라이브러리 헤더 파일은 /user/include 에 있습니다. 또한 헤더파일에서 함수 정의가 함수와 괄호 사이에 공백문자가 존재하므로 아래와 같이 명령을 내리면 헤더 파일을 찾으 실 수 있습니다.

]$ grep -nr " 함수이름 (" /usr/include/

]$ grep -nr " sleep (" /usr/include/ 
/usr/include/alsa/iatomic.h:1050:/* Duration of sleep (in nanoseconds) when we can't acquire a spin-lock
/usr/include/unistd.h:390:extern unsigned int sleep (unsigned int __seconds);

 

태그: *초보