source

헤더 파일을 C/C++에 여러 번 포함

factcode 2022. 8. 11. 21:56
반응형

헤더 파일을 C/C++에 여러 번 포함

헤더 파일을 C 또는 C++에 여러 번 포함시키는 것이 도움이 됩니까?

이 메커니즘이 전혀 사용되지 않는다면 컴파일러는 왜 파일을 두 번 포함시키는 것을 걱정합니까? 만약 그것이 정말 쓸모없다면 새로운 컴파일러가 모든 헤더를 한 번만 포함시키는 것이 더 편리하지 않을까요?

편집:

가드와 프래그마를 포함한 표준적인 방법이 있는 것은 알고 있습니다만, 그마저도 명기할 필요가 있는 이유는 무엇입니까?파일을 한 번만 포함하는 것이 컴파일러의 기본 동작이어야 하지 않나요?

네, 프리프로세서로 코드를 생성하거나 Boost와 같은 트릭을 할 때 유용합니다.PP는 그래요.

예를 들어 X 매크로를 참조하십시오.기본 개념은 파일에 매크로의 본문이 포함되어 있으며,#define의론하고 나서#include여기 조작된 예가 있습니다.

macro.xpp

std::cout << MESSAGE;
#undef MESSAGE

file.cpp:

int main() {
# define MESSAGE "hello world"
# include "macro.xpp"
}

이 기능을 통해#if일반적인 매크로로는 할 수 없는 논쟁거리들이죠

네, 헤더를 여러 번 포함하면 편리합니다(매우 드물지만).표준적인 예는 다음과 같습니다.<assert.h>를 정의합니다.asssert유무에 따라 다르게NDEBUG정의되어 있는지 여부를 나타냅니다.따라서 NDEBUG의 (보통 조건부) 정의를 가진 후 (적어도) 다른 정의와 함께 다시 포함시키는 것이 타당할 수 있습니다.assert:

assert현재 상태에 따라 매크로가 재정의됩니다.NDEBUG그럴 때마다<assert.h>포함되어1 있습니다.

그러나 대부분의 헤더는 (즉, 얼마나 자주 포함되든 동일한 효과를 얻기 위해) 유휴성을 유지하기 위해 약간의 노력을 기울입니다.


1C99, § 7.2/1.

전형적인 예(테스트되지 않음) - 포인트는 열거 목록이 일관되게 표시되도록 인수분해하는 것입니다.enum스트리밍 코드:

// states.h
X(Uninitialised)
X(Initialised)
X(Running)
X(Complete)
X(Shutdown)

// app.c++
#if defined(X)
# error X is already defined
#endif

enum States {
    #define X(TAG) TAG,
    #include "states.h"
    #undef X
    Extra_So_Trailing_Comma_Ignored
};

std::ostream& operator<<(std::ostream& os, const States& state)
{
    #define X(TAG) if (state == TAG) return os << #TAG;
    #include "states.h"
    #undef X
    return os << "<Invalid-State>";
}

네, 1회만 포함하면 편리하기 때문에 #pragma를 C++에서 1회 사용합니다. : )

편집:

주의: #pragma once는 포터블이 아닙니다.사용할 수 있습니다.

#ifndef FILENAME_H
#define FILENAME_H

대신 헤더 파일 맨 위에 저장하십시오.

여러 개의 포함을 수동으로 유지 관리하고 싶지 않은 "지루한" 코드 생성이 필요할 때마다 여러 번 사용할 수 있습니다.

일반적인 예로는 C/C++ 열거형 및 대응하는 문자열이 있습니다.이 문자열은 대략 다음과 같습니다.

// MYENUM_VALUES.H
MYENUMVALUE(a)
MYENUMVALUE(b)
MYENUMVALUE(c)
MYENUMVALUE(d)

// MYENUM.H
#define MYENUMVALUE(x) x,
enum MyEnum
{
#include "MYENUM_VALUES.H"
}
#undef MYENUMVALUE

// MYENUMTOSTRING.C
#define MYENUMVALUE(x) case x : return #x;

const char * MyEnumToString(MyEnum val)
{
    switch (val)
    {
    #include "MYENUM_VALUES.H"
    default return "unknown";
    }
} 
#undef MYENUMVALUE
#ifndef _INC_HEADER_
#define _INC_HEADER_

//header code

#endif

서 ★★★★★HEADER

main_win.h 되다_INC_MAIN_WIN_

언급URL : https://stackoverflow.com/questions/10877494/including-header-files-in-c-c-more-than-once

반응형