programing

C++ 및 C의 헤더 가드

i4 2023. 9. 13. 22:19
반응형

C++ 및 C의 헤더 가드

LearnCpp.com | 1.10 전처리기를 처음 봅니다.헤더 보호 아래에는 다음과 같은 코드 조각이 있습니다.

add.h:

#include "mymath.h"
int add(int x, int y);

빼다h:

#include "mymath.h"
int subtract(int x, int y);

main.cpp:

#include "add.h"
#include "subtract.h"

헤더 가드를 구현할 때 다음과 같이 언급됩니다.

#ifndef ADD_H
#define ADD_H

// your declarations here

#endif
  • 선언문이 여기에 무엇이 있을까요?그리고, 그래야 합니다.int main()다를 #endif?
  • 추가하고 있습니까?_H컨벤션이나 꼭 해야 할 일?

감사해요.

FILENAME_H는 관례입니다.당신이 정말 원한다면, 당신이 사용할 수 있습니다.#ifndef FLUFFY_KITTENS헤더 가드로서(다른 곳에서는 정의되지 않았다면), 하지만 다른 곳에서 정의한다면, 그것은 까다로운 버그가 될 것입니다. 예를 들어 무언가 또는 다른 것에 대한 고양이의 수와 같이 말이죠.

add 그대로 add 사이에 .h에서 선언은 말 그대로 다음 사이에 있습니다.#ifndef그리고.#endif.

#ifndef ADD_H
#define ADD_H

#include "mymath.h"
int add(int x, int y);

#endif

마지막으로 .int main()헤더 파일에 있으면 안 됩니다.은상안야다에asn야ted은에 있어야 합니다..cpp파일.파일.

정리하기

#ifndef ADD_H기본적으로 "ADD_H가 다음과 같이 되지 않았다면"을 의미합니다.#defined파일에 다음,에된에는의서를다고를다의enne에서고는,,에 사이의 코드를 컴파일합니다.#ifndef그리고.#endif지시."그래서 만일 당신이 노력한다면.#include "add.h"한 번번이.cpp일이고는 ADD_H미지볼다가다t볼ee미ye지,,일는lredd_hh#defined고그의를할다다need 사이의 코드를 무시합니다.#ifndef그리고.#endif 번 합니다. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..cpp는 다른일을 수 . 헤더 가드는 다른 사람들을 막지 못합니다..cpp헤더 파일을 포함하여 파일을 저장합니다.하지만 모두.cpp파일은 보호된 헤더 파일을 한 만 포함할 수 있습니다.

  • 하나의 구현(.cpp") 파일을 사전 처리한 결과는 번역 단위(TU)입니다.

  • 헤더는 다른 헤더를 포함할 수 있으므로, 헤더는 동일한 TU 내에서 여러 번 간접적으로 포함될 수 있습니다. (Mymath.h가 이 예입니다.)

  • 정의는 TU당 최대 한 번만 발생할 수 있습니다. (일부 정의는 여러 TU에 있어서도 안 되며, 이 경우는 약간 다르므로 여기서는 논의하지 않습니다.)

  • 이 문제는 가드 해결을 포함하여 주어진 헤더가 하나의 TU 내에 두 번 이상 포함될 때 다중 정의 오류를 방지하는 것입니다.

  • 두 번째와 그 다음에 포함되는 항목이 노옵스(no-ops)가 되도록 헤더의 내용을 "래핑(wrapping)"함으로써 가드 작업을 포함합니다.#ifndef/#define 명령어는 파일의 처음 두 줄, #endif는 마지막 줄이어야 합니다.

  • 포함 가드는 헤더에만 사용됩니다.머리글에 주 기능을 정의하지 말고 구현 파일에 넣으십시오.

If you have a header that will define a type and declare a function, but also needs a header itself:

#include "other_header.h"

struct Example {};

void f();

"Wrapping" it with include guards gives the complete contents of the file:

#ifndef UNIQUE_NAME_HERE
#define UNIQUE_NAME_HERE

#include "other_header.h"

struct Example {};

void f();

#endif

The name used for the include guard must be unique, otherwise conflicting names will give confusing results. These names are only simple macros, and there is nothing in the language which enforces a certain style. However, project conventions usually impose requirements. There are several different include guard naming styles you can find here on SO and elsewhere; this answer gives good criteria and a good overview.

All the header guards do is to only allow your headers to be included once. (If they're included multiple times, they're ignored.)

The name you use doesn't matter, but it's conventional to use the file name in caps, including the extension like you demonstrated.

당신의.main정말로 A에 있어야 합니다..cpp파일이지만 헤더에 넣을 경우 여러 번 선언되지 않도록 가드 안에 넣으십시오.

아닙니다. 메인()은 .cpp로 들어갑니다.그 선언문들은 당신이 머리말에 넣으려고 했던 다른 것들입니다._H는 컨벤션입니다. 다양한 헤더 가드 컨벤션을 주변에서 볼 수 있습니다.

나는 헤더 파일과 정의에서 선언을 선언합니다.int main()들어오다source.cpp파일.

_H단지 누군가가 include guards를 사용하여 헤더 파일을 포함할 것임을 표시하기 위한 것입니까?

MSVC++를 사용하는 경우 사용할 수 있습니다.#pragma once

ReferenceURL : https://stackoverflow.com/questions/4767068/header-guards-in-c-and-c

반응형