현재까지는 그저 하나의 .c확장자의 소스코드 내에서 함수를 정의하고 main함수를 실행시켰어요. 우리들이 C언어의 내용을 공부하면서는 문제가 없었지만 현업에서는 우리가 지금까지 작성해온 연습코드와는 비교도 안될정도의 방대한 양의 코드를 작성하고 관리합니다. 이런 측면에서 생각했을 때 하나의 C 파일에 모든 변수와 함수를 담기에는 무리가 있고 관리에 있어서도 비효율적인 측면이 너무 큽니다. 따라서 실제로는 용도별로 헤더파일과 C 소스파일을 분할해하여 변수와 함수를 정의합니다. 오늘은 이러한 파일을 분할하여 프로그램을 작성하는 방법에 대해서 이야기하고자 합니다.

111-2

위와 같이 main함수가 있는 main.c 이외에도 필요한 변수가 정의되어있는 variables.c와 함수들이 정의되어있는 funcs.c 각각의 소스파일로 분할하였습니다. 그런데 이렇게 하면 컴파일 오류가 나고 위와 같은 에러 메시지가 뜹니다.

위와 같은 오류가 나는 이유는 다음과 같습니다. 컴파일은 파일별로 진행이되는데 main함수에 있는 변수나 함수들은 main.c에서는 정의가 된 적이 없기 때문이에요.

파일을 분할할 때에는 '프로젝트 내의 다른 파일에 변수나 함수가 정의되어있으니 거기서 찾아서 써라' 는 사실을 알려주어야 합니다. 이를 하는 방법은 extern이라는 선언자를 사용하는겁니다.

222-2

extern으로 외부 변수와 함수를 선언해주면 컴파일러가 알아서 외부의 변수와 함수를 사용하기때문에 컴파일에러가 나지 않습니다.

그런데 만약 아주 중요한 변수가 하나 있는데 혹시모를 오류를 방지하기위해 외부 파일에서 접근을 허용하지 않을때에는 static 선언을 해주면 돼요. 사실 static 선언은 어떤 함수 내부에서 선언되는 지역변수가 함수의 호출이 종료되어도 소멸되지 않게 하기위해서 사용했는데, 전역변수에 static을 붙이면 이 전역변수에 외부의 접근을 허용하지 않는다는 의미가 됩니다. 헷갈리지 마세요.

333-2

variables.c의 num3 전역변수는 static 선언으로 외부에서의 접근을 허용하지 않도록 선언하였습니다. 그런데 main.c에서 num3를 가져다 쓰려고 했기때문에 컴파일 오류가 생겼어요. 오류 메시지를 한 번 보시죠.

444

num3를 참조하지 못하여 발생한 에러라는 의미입니다.

우리는 외부의 변수나 함수를 사용하려고 extern선언을 하여 컴파일러에게 알려주고 사용을 했습니다. 그런데 실제 현업에서 사용하는 프로그램들은 파일의 양이 엄청나게 방대하기때문에 매번 이런식으로 extern선언을 사용하기가 번거롭습니다. 따라서 이러한 선언들을 .h확장자이 헤더파일에 모아두고 사용해요.

555

header1.h 헤더파일에 자주쓰는 외부 변수와 함수들을 선언해두고 main함수에서는 그냥 #include 지시자를 써서 header1.h에 있는 내용을 포함시켰습니다. 다시 한 번 말씀드리면 #include 라는 문장은 header1.h의 모든 코드를 복사해서 ctrl+c ctrl+v 하는것과 똑같다 했습니다.

보통의 헤더파일에는 이러한 자주 사용하는 변수와 함수들을 정의해놓기도 하고 중요한 것 한 가지가 구조체도 기본적으로 헤더파일에 정의해두는게 좋습니다. 만약 구조체를 .c확장자의 소스파일에 정의해두면 extern 선언을 직접 해주어야하는데, 구조체의 길이를 생각한다면 이는 번거로운 작업이 될 것입니다.

그런데 한 가지 눈에 띄는게 stdio.h 헤더파일과 header1.h 헤더파일을 삽입하는 방법이 달라요. stdio.h는 <>를 사용하고 header1.h는 ""를 사용해서 포함시킵니다.  이 둘의 차이점은 다음과 같습니다.

< > : C에서 기본적으로 제공되는 헤더파일들이 저장되어있는 디렉터리에서 파일을 찾아온다.

” ” : 작성중인 소스파일이 있는 디렉터리에서 파일을 찾아온다.

따라서 < >는 C에서 제공하는 표준 헤더파일들을 찾아올 때 사용하고 ” “는 사용자가 직접 정의한 헤더파일을 찾아올 때 사용이 됩니다.

+ Recent posts