헤더 파일을 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
'source' 카테고리의 다른 글
VueJs 및 VueResource, Ajax 요청에서 헤더 필드 제거 (0) | 2022.08.12 |
---|---|
각 OS에서 C/C++를 재컴파일해야 하는 이유는 무엇입니까? (0) | 2022.08.11 |
Vue.js 클릭 후 이전 클래스를 삭제할 때 활성 클래스를 추가하려면 (0) | 2022.08.11 |
Nuxt.js를 사용할 때 동적 Vuex 모듈을 초기화할 때 가장 적합한 방법은 무엇입니까? (0) | 2022.08.11 |
메이븐과의 관계도 포함해서 (0) | 2022.08.11 |