프로그래머/CPP_메모

header

미역국마싯 2022. 3. 16. 11:13

기본 개념

1. header 파일 예시

예를들면, test.h 라는 헤더 파일이 있고 안에 namespace { class { function } }이 있다하자. 여기서 어떻게 동작하는지와 같은 자세한 내용은 작성하지 않는다. 즉, 틀만 작성한다.

// test.h

namespace N
{
	class test
	{
	public:
		void function();
	private:
		 int value = 0;
	};
}

 

2. .cpp 파일 예시

이제 test.cpp 파일을 만들고 #include "test.h"로 컴파일러에게 test.h에 정의된 내용을 알려준다. header 파일에 틀을 작성했다면, .cpp 파일에는 틀이 어떻게 동작하는지 작성해주면 된다. header 파일에서 function의 기능을 작성하지 않았기에 .cpp 파일에서는 class::function() { 기능 }을 정의한다.

// test.cpp

#include "test.h"    // 작성한 헤더 파일
using namespace N;

void test::function()
{
	// 기능 작성
}

정리하면 header 파일에 틀을 작성하고, .cpp 파일에는 각 틀에 대한 기능을 정의한다.

 

추가로 test.h에 있는 namespace 이름을 .cpp 파일에서 using namespace ???;로 알려주지 않으면,

namespace이름::class이름::function이름()처럼 작성해야 한다. 이는 using namespace std;를 통해 std::cout가 아닌 cout로 사용하는 것을 생각하면 된다.

void N::test::function()
{
	// 기능 작성
}

 

3. main 파일 예시

이제 main으로 사용하는 파일에서 header 파일을 #include를 통해 불러오고 사용하면 된다.

#include <iostream>  // 컴파일러가 제공하는 헤더 파일
#include "test.h"    // 작성한 헤더 파일
using namespace std;

int main()
{
	test my_test;
	my_test.function();
}

 

4. 참고 자료

https://docs.microsoft.com/en-us/cpp/cpp/header-files-cpp?view=msvc-170 

 

Header files (C++)

Learn more about: Header files (C++)

docs.microsoft.com


 

#pragma once

클래스 파일( h, cpp )을 생성했을 때, header파일에 #pragme once가 자동 생성되는 것을 볼 수 있다.

// Test.h

#pragma once

이는 해당 header 파일이 main에서 여러번 호출되면 하나만 적용하고 나머지는 무시하게 해준다. 

#include "Test.h"
#include "Test.h"	// 무시
#include "Test.h"	// 무시

int main()
{
}

해당 기능이 중요한 이유는 header 파일에 선언문만 사용하는게 아니라 구현까지 했을 때 문제가 생기기 때문이다.

 

// Test2.h

#pragma once
struct Test
{
	int number;
};

void Test();

// main.cpp
#include "Test2.h"
#include "Test2.h"

int main()
{
}

Test2.h 파일처럼 선언과 구현을 모두 했을 경우 #pragme once가 없으면 같은 구조체가 두 번 생성된다.

// main.cpp

// #include "Test2.h"
struct Test
{
	int number;
};
void Test();

// #include "Test2.h"
struct Test
{
	int number;
};
void Test();

int main()
{
}

이렇게 같은 구조체가 두 번 호출되면 충돌이 발생한다.

 

Template<typename T>

헤더 파일에서 class를 정의할 때, template<T>를 사용하는 경우가 있다.

template<T> class는 cpp 파일에 분리할 수 없다

따라서 해당 class는 헤더 파일에 기능까지 구현해야 한다.

'프로그래머 > CPP_메모' 카테고리의 다른 글

c++ 연산자 오버로딩 정리  (0) 2022.04.03
c++ 배열 정리  (0) 2022.03.21
c++ 참조 정리  (0) 2022.03.20
c++ 포인터 정리  (0) 2022.03.20
c++의 다양한 input 방법과 속도 비교  (0) 2022.03.17