> 백엔드 개발 > C++ > 내 포함 가드가 재귀 포함 및 다중 기호 정의를 방지하지 못하는 이유는 무엇입니까?

내 포함 가드가 재귀 포함 및 다중 기호 정의를 방지하지 못하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-22 19:37:11
원래의
600명이 탐색했습니다.

Why Are My Include Guards Failing to Prevent Recursive Inclusion and Multiple Symbol Definitions?

왜 내 포함 가드가 재귀 포함 및 다중 기호 정의를 방지하지 않습니까?

첫 번째 질문:

왜 포함하지 않습니까? 내 헤더 파일을 상호, 재귀로부터 보호하는 경비원 포함?

포함 경비원이 제 역할을 하고 있습니다. 문제는 상호 포함 헤더의 데이터 구조 정의 간의 종속성으로 인해 발생합니다.

예를 들어 a.h 및 b.h에 다음이 포함되어 있다고 가정합니다.

// a.h
#ifndef A_H
#define A_H
#include "b.h"
struct A {...};
#endif

// b.h
#ifndef B_H
#define B_H
#include "a.h"
struct B {...};
#endif
로그인 후 복사

include 가드가 없으면 main.cpp는 컴파일 깊이 제한으로 인해 컴파일됩니다.

Include Guard를 사용하면 무한 재귀를 방지할 수 있습니다. 그러나 정의 간의 종속성은 그대로 유지됩니다.

  • a.h를 컴파일하는 동안 전처리기는 #include "b.h"를 발견하고 이를 처리합니다.
  • b.h를 처리하는 동안 #include "a.h"를 발견하고 이를 처리합니다. 다시 처리합니다.
  • 이렇게 하면 B가 정의되기 전에 A가 정의되어야 하는 종속성이 생성됩니다. 정의되었습니다.

이 문제를 해결하려면 필요한 헤더에 전방 선언을 사용하세요.

// b.h
#ifndef B_H
#define B_H
struct A; // Forward declaration
struct B {...};
#endif
로그인 후 복사

두 번째 질문:

포함하지 않는 이유 가드가 여러 정의를 방지합니까?

경비를 포함하면 방지할 수 있습니다. 단일 번역 단위 내에서 재정의하지만 다른 단위에 걸쳐 재정의하지는 않습니다.

예를 들어 header.h:

#ifndef HEADER_H
#define HEADER_H
int f() {...};
#endif
로그인 후 복사

source1.cpp 및 source2와 같은 여러 번역 단위에 포함되는 경우입니다. cpp:

// source1.cpp
#include "header.h"

// source2.cpp
#include "header.h"
로그인 후 복사

링커는 별도의 개체에서 동일한 정의를 보기 때문에 f()의 여러 정의에 대해 불평합니다. files.

이 문제를 해결하려면 다음 접근 방식을 사용하세요.

  • 인라인 키워드: 컴파일러에 함수 본문을 인라인하도록 지시하여 링커 없이 여러 정의를 허용합니다. 오류.
  • 정적 키워드: 함수에 내부 연결을 제공하여 개인 복사본을 생성합니다.
  • 이름 없는 네임스페이스: 이름 없는 네임스페이스에서 함수를 선언하면 내부 연결이 제공되어 다중 정의가 방지됩니다.

위 내용은 내 포함 가드가 재귀 포함 및 다중 기호 정의를 방지하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿