C언어 C++ Programming

[C언어/C++]#pragma once 사용 목적, 예제로 쉽게 알아보기(이유,샾)

끄적끄적아무거나 2023. 7. 25. 08:34
반응형

 

목차

     

     

     

     

    [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.

     

     

     

    반응형