+ 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


 + 코드를 작성할 때, 원활한 유지보수를 위하여 모듈화를하여 코드를 작성합니다. 


 + main 함수를 기점으로, Class나 Struct 등과 같이 서로 연관된 것들을 한 곳에 보관하여 관리하는 것이죠.


 + 이렇게 모듈화를 하기 위해선 먼저 연관된 것을을 묶고, 묶은 것들에 대해 *.h 파일*.cpp 파일을 만들어야 합니다.

   - *는 동일한 이름을 가지고 있어야 합니다.


 + *.h 파일에는 선언만 해두고, *.cpp 파일에는 정의를 하면 됩니다.


 + *.h 파일을 작성할 때, 주의해야할 점이 있습니다. 바로 재정의를 방지하기 위한 작업을 해야한다는 것입니다.



<why>

 + 재정의를 방지하는 이유는 파일에서 해당 header파일이 여러번 선언되기 때문입니다.


 + 헤더파일이 나눠져있으면 상관없지 않냐고 할 수 있지만, 그렇지 않습니다. 우리가 컴파일를 하고 빌드를 하게될 때, 문제가 발생하게됩니다.


 + 컴파일을 하게되면, 모든 소스파일이 기계어로 번역이됩니다. 번역이 된 기계어는 서로 *.obj 파일로 변형되어, 빌드 시 서로 연결되어 실행이 되는 것입니다.


 + 컴파일을 할 때, header파일을 선언하게되면, 해당 header파일에 작성된 코드들이 main파일에 그대로 복사가 되어 붙게됩니다. 그렇기에, 여러번 header파일을 선언하게되면, 같은 것들이 중복으로 선언되어 컴파일 에러가 발생하는 것이죠.


 + "중복안되게 코드를 작성하면 되지 않나?" 라고 하실 수 있겠지만... 직접 해보시면 압니다.



<method>

 + 재정의를 막는 방법은 크게 2가지가 있습니다.

1) include guard - 표준

2) pragma once - 비표준



include guard)

 + macro wrapper 방식을 이용하여 재정의를 방지합니다.

 + 표준 방식으로 어느 컴파일러에서도 동작합니다.

 + 해당 header파일을 나타낼 코드를 선언하고, 그 코드가 이전에 선언되지 않았으면 코드를 컴파일합니다.

 + 해당 선언한 코드는 마음대로 작성하셔도 되지만, 일반적인 코딩 Standard에서는 대문자로 작성하는 것을 지향합니다.



pragma once)

 + 이 방법 또한 전처리기를 이용한 재정의 방지법입니다.

 + 비표준으로써, 호환되지 않는 컴파일러도 있습니다.

 + #pragma는 컴파일러 제조회사에서 컴파일러의 기능을 확장시킬 수 있도록 하는 지시자입니다.

 + 표준 컴파일러에서 자신의 컴파일러 제작 기술이 허락하는 대로 최대한의 기능을 제공할 수 있도록 여지를 남겨둔 것으로, 만약 다른 컴파일러에서 해석할 수 없는 pracma를 만나면 그냥 무시하게됩니다.

 + 해당 선언은, 컴파일러에게 해당 header파일이 한 번만 빌드되도록 알려주는 명령어입니다.



*** 참고할 점

 - 이전에는 include guard방식이 매번 정의되어있는지 확인하기에 pragma once보다 작업량이 많았으나, 최신 컴파일러에서는 pragma once처럼 한 번 재정의 판단을 하게되면, 그 다음은 판단을 하지않게되어 성능상 차이가 없어졌다.

 - 좀 더 범용적인 소스를 작성할 땐, include guard를 사용해야하고, 그 이외는 pragma once를 사용하셔도 괜찮을 것입니다.

 - 하지만, 표준을 지향하길 추천드립니다.


** 참고사이트 **

 - http://sarghis.com/blog/941/


Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

+ Recent posts