티스토리 뷰

낙서

C++ #pragma once

nodeal 2017.10.19 09:40

마이크로소프트 Visual Studio를 사용하면서 Visual C++를 사용하다보면 종종 새 헤더를 생성하면서 '#pragma once'라는 코드와 생성되는 것을 확인할 수 있다.


또, C 또는 C++ 헤더를 작성하면서 헤더가 중복돼서 포함되지 않도록 매크로를 사용하는 경우가 많..지 않고 모든 경우에서 사용한다.

#ifndef __SOME_OF_HEADER_H
#define __SOME_OF_HEADER_H

// ... code ...

#endif

매크로의 이름은 다양하게, 각자의 코딩 스타일에 맞게 작성하겠지만 이런 뉘앙스의 코드를 작성해서 중복된 헤더 포함을 피할 것이다.


하지만 이쁘지도 않고 vim같은 도구로 코드를 작성하는 사람들은 귀찮거나 보기 나쁜 코드가 될 수도 있다. 이를 한번에 해결해주는 것이 #pragma once 이다.


말 그대로 한번만 작동하게끔 하라는 뜻인데 맨 위 한 줄만 작성하는 것으로 그 기능을 하게 된다.


문제는 이 기능이 비표준으로 어디에서나 생성가능한 코드라는 것을 보장하지는 않는다.


물론 MSVC뿐만 아니라 GCC나 clang같은 컴파일러도 모두 지원은 하니, 굳이 표준에 꼭 맞는 프로그램을 짜야하는 라이브러리 같은 프로젝트가 아니라면 사용하는 것도 괜찮을 것 같다.


표준에 대해서 이야기 하자면 #pragma 자체는 표준 지시어가 맞지만 once가 표준이 아닐 뿐이다.

Preprocessor가 인식하는 차이가 있었지만(이전에는 #ifndef는 매번 파일을 불러오고 읽고 확인한 후 정의되어있었다면 무시하는 방법) 이제는 많은 전처리기들이 기억하는 방식이 되어 같은 원리로 작동된다. 

'낙서' 카테고리의 다른 글

빠른 프로그램, 동적 프로그래밍  (0) 2017.10.19
Java에는 포인터가 없다?  (0) 2017.10.19
C++ #pragma once  (0) 2017.10.19
C++ 포인터 주소값 저장하기  (0) 2017.10.12
C++ 동적할당의 고찰  (0) 2017.08.07
[HOWTO] Windows8 설치하기  (0) 2013.12.30
댓글
댓글쓰기 폼