C++의 프라그마 원스

Muhammad Husnain 2024년2월16일
C++의 프라그마 원스

이 기사는 전처리기 지시문으로서의 pragma once에 대한 개요와 사용 방법에 대한 간단한 예제로 시작합니다. 그런 다음 C 및 C++에서의 지원과 관련하여 pragma once의 몇 가지 특정 속성을 다루고 마지막으로 사용 방법과 대안보다 나은 방법에 대한 보다 전체적인 예를 포함합니다.

C++의 프라그마 원스

pragma once는 C 및 C++에서 전처리기 지시문으로 사용됩니다. 전처리기 지시문은 프로그램을 구성하지 않고 대신 전처리기가 읽는 코드의 한 줄 조각입니다.

전처리기는 코드를 컴파일하기 전에 이를 분석합니다. 전처리기는 이러한 지시문 끝에 세미콜론을 기대하지 않습니다.

따라서 코드에 pragma once 지시문을 추가하려면 파일 맨 위에 다음을 추가하십시오.

#pragma once

pragma Once 자체는 비표준입니다. 즉, 일부 컴파일러는 지원하지 않으며 복잡한 구현으로 인해 항상 신뢰할 수 있는 것은 아닙니다.

그러나 매우 일반적으로 지원됩니다. 따라서 대부분의 경우 pragma once를 사용하는 것은 문제가 되지 않습니다. 그 목적은 간단합니다. 현재 소스 파일(지시문이 작성되는 파일)이 컴파일에 한 번만 포함되도록 합니다.

이 작업은 include 가드를 대신 사용하여 수행할 수 있습니다. pragma once가 어떻게 사용되는지 예를 들어 그 차이점에 대해 논의할 것입니다.

pragma once는 주로 클래스를 정의할 때 사용됩니다. 다음 예에서는 StructureRoom이라는 두 개의 클래스를 정의합니다.

Room 클래스는 Structure 클래스에서 상속됩니다.

// This contains the code for the Structure class
// Save this as Structure.h
#pragma once

#include <iostream>
#include <string>

using namespace std;

class Structure {
  string struc_name;
  int id;

 public:
  void setVals() {
    struc_name = "Example Name";
    id = 1;
  }

  void printVals() {
    cout << "Name is: " << struc_name << " and id is: " << id << endl;
  }
};

이제 Room 클래스를 정의합니다.

// Save this as Room.h
#pragma once

#include "Structure.h"

class Room {
  Structure example;

 public:
  void initRoom() { example.setVals(); }

  void getRoom() { example.printVals(); }
};

이제 위의 객체를 사용하는 main 함수를 정의할 수 있습니다.

// save this in a main.cpp file
#include <iostream>

#include "Room.h"
#include "Structure.h"

using namespace std;

int main() {
  Room testRoom;

  testRoom.initRoom();
  testRoom.getRoom();

  return 0;
}

위의 예에서 코드를 실행하면 Name is: Example Name and id is: 1이 출력으로 표시되며 이는 우리가 예상하는 것입니다. 그러나 pragma once를 제거하면 다음 오류가 발생합니다.

In file included from Room.h:3,
                 from main.cpp:2:
Structure.h:8:7: error: redefinition of 'class Structure'
    8 | class Structure
      |       ^~~~~~~~~
In file included from main.cpp:1:
Structure.h:8:7: note: previous definition of 'class Structure'
    8 | class Structure
      |       ^~~~~~~~~

Structure 클래스는 두 번 정의됩니다. pragma once를 사용하여 한 번만 읽도록 할 수 있습니다.

대안은 식별자를 대신 사용하는 것입니다. 위의 예와 관련하여 아래와 같이 정의할 수 있습니다.

#ifndef STRUCTURE
#define STRUCTURE

class Structure {
  // Some sample code here
};
#endif

위의 예에서 STRUCTURE는 무엇이든 바꿀 수 있습니다. 그러나 일반적으로 클래스 이름에 해당하는 이름으로 유지합니다.

그러나 여기에는 가능한 문제가 있습니다. 첫째, 더 장황하고 수동 의사 결정이 필요하며 컴파일러는 실수로 프로젝트의 다른 곳에서 매크로 이름을 사용하는 프로그래머로부터 보호할 수 없습니다.

컴파일러는 일반적으로 pragma once에 최적화되어 컴파일 속도를 높입니다.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn