프로그램의 크기가 커지다 보면 파일들을 나누게 되고, 당연히 헤더 파일들이 필요해진다. 위 사진과 같이 헤더 파일을 include하면 그 헤더를 통째로 가져오게 된다. 위에서 add_song이라는 함수는 실제 main문에는 없지만 include한 library.c에 있기에 오류 없이 넘어갈 수 있다. 이후에 이 main문에 있는 add_song과 library.c에 있는 add_song을 연결시켜주는 건 linker가 해주는데 일단은 넘어가자.
헤더 파일에 적힐(공유할) 내용들은 매크로, type정의 / 함수 / 변수 들이다. 가장 까다로운 것이 변수인데,
헤더 파일에 a라는 변수를 선언하고, 이를 include하고 있는 다수의 소스들이 이 변수를 변경하면 혼란이 발생한다. 그렇다고 해서 다시 정의하자니 그건 더이상 같은 변수가 아니게 되는 것이다.
위 내용을 보면 알 수 있겠지만, 헤더 파일에서 필요한 것은 변수의 정의가 아닌 선언이다. 그래서 이 변수가 있다고 선언만 할 거야! 라는 의미에서 extern이라고 변수의 형 앞에 명시를 하는 기능을 제공하고 있다.
그럼 이렇게 공유 변수를 사용할 수 있게 되었다. 헤더 파일에서는 변수의 선언만 해 주었고 c파일에서 변수를 정의한 경우이다. 그런데 이렇게 공유되는 변수가 생긴다는 자체가 이렇게 골칫덩어리여서 애초에 이런 경우가 생기지 않도록 하는 것이 최선의 방법일 것이다.
다음으로는 다수의 c파일들에서 같은 헤더 파일을 include할 경우 생기는 문제에 대해서이다. 사실 같은 헤더 내용이 두 번 중복되는 경우 문제가 되는 것은 타입 정의가 중복되는 경우이다. 어떤 구조체를 정의했는데 다시 같은 이름의 구조체를 정의하면 그것은 오류인 것이다. 이것은 c프로그래밍에만 해당되는 문제가 아니라서 많이들 이미 알고 있겠지만, 이러한 경우를 피하기 위한 일종의 trick이 있다.
임의의 매크로를 만들어서 위와 같이 중복을 막는 것이다~
'공부' 카테고리의 다른 글
C 언어 - 파일을 load 할 때 주의할 점 (0) | 2019.02.04 |
---|---|
C 언어 형 변환(캐스팅)시 주의할 점 (0) | 2019.02.04 |
mbed os - 간단한 프로젝트 (0) | 2019.02.01 |
SLAM 공부했다 - (2) (0) | 2019.01.26 |
RTOS 시스템 mbed os - thread 정리 (0) | 2019.01.25 |