목차
[C언어/C++]#pragma once 사용 목적
#pragma once는 C++에서 헤더 파일의 중복 포함을 방지하는 데 사용되는 전처리기 지시문입니다.
결론적으로 헤더가 중복적으로 포함되었을 경우 C 프로그램이 Linking 작업 중에 오류를 일으키기 때문에 중복 되는 경우 알아서 중복을 제거해달라는 뜻입니다.
이를 사용하는 이유는 다음과 같이 설명할 수 있습니다:
1. 효율성: #pragma once를 사용하면 컴파일러가 헤더 파일을 한 번만 포함하도록 보장합니다. 따라서 이미 포함된 헤더 파일은 다시 처리하지 않아도 됩니다. 이는 빌드 시간을 단축시키고 컴파일 속도를 향상시킵니다.
2. 가독성: #pragma once는 전통적인 include guards보다 간단하고 가독성이 좋습니다. Include guards는 #ifndef, #define, #endif와 같은 세 개의 전처리기 지시문을 사용해야 하므로 코드가 길어지고 장황해질 수 있습니다. #pragma once는 단일 지시문으로 헤더 중복 포함을 처리합니다.
3. 예방성: 실수로 같은 헤더 파일을 두 번 이상 포함하는 것을 방지합니다. 이는 컴파일 에러를 사전에 방지하여 코드의 안정성과 유지 보수성을 향상시킵니다.
4. 포팅성: #pragma once는 C++ 표준에 포함된 기능이 아니라 대부분의 주요 컴파일러에서 지원하는 확장 기능입니다. 따라서 대부분의 환경에서 호환성과 이식성을 높여줍니다.
#pragma once의 장점들을 고려하면, C++ 프로젝트에서 헤더 파일을 만들 때 #pragma once를 사용하는 것이 일반적으로 좋은 습관으로 권장됩니다. 하지만 환경에 따라 특정 제한 사항이나 이슈가 있을 수 있으므로 다른 방법도 고려할 필요가 있습니다.
[C언어/C++]#pragma once 예제 실습
main.cpp>>
#include <iostream>
#include "myheader.h"
#include "myheader.h" // 중복 포함을 시도합니다.
int main() {
std::cout << "Main function" << std::endl;
printMessage();
return 0;
}
myheader.h>>
#pragma once
#include <iostream>
void printMessage() {
std::cout << "Hello, this is myheader.h!" << std::endl;
}
결과>>
주석>>
#pragma once
위 구문을 헤더에 넣지 않을 경우 아래와 같은 에러가 발생합니다.
에러 메세지>>
Severity Code Description Project File Line Suppression State
Error C2084 function 'void printMessage(void)' already has a body Project7 C:\Users\forgo\source\repos\Project7\Project7\myheader.h 5
In file included from main.cpp:3:
myheader.h:5:6: error: redefinition of 'void printMessage()'
void printMessage() {
^
main.cpp:3:6: note: previous definition is here
void printMessage() {
^
1 error generated.
'C언어 C++ Programming' 카테고리의 다른 글
[C언어/C++]전처리기 #ifdeff란? 사용 목적, 예제로 쉽게 이해하기(Preprocessor, sharp) (0) | 2023.07.28 |
---|---|
[C언어/C++] Namespace이란? 사용 목적, 예제로 이해하기 (0) | 2023.07.26 |
[C++]헤더파일 사용 예제로 이해하기(Header file) (0) | 2023.07.24 |
[C언어]정수자료형, 실수 자료형 크기, 범위 출력방법, 예제 코드로 크기 출력(Byte, Size, Range, printf) (0) | 2023.07.19 |
[C++]변수 초기화를 해야하는 이유, 할당(Variable Initialization, Assignment) (0) | 2023.07.18 |