source

헤더 파일을 포함하여 external과 #를 사용하는 것의 차이점은 무엇입니까?

manysource 2023. 10. 22. 20:11

헤더 파일을 포함하여 external과 #를 사용하는 것의 차이점은 무엇입니까?

다른 모듈(다른 파일)의 변수/함수에 액세스하는 데 사용되는 "외부" 키워드의 유용성에 의문을 제기하기 시작했습니다.변수/함수 프로토타입 또는 함수/변수 정의가 포함된 헤더 파일을 가져오기 위해 #include preprocessor를 사용할 때도 동일한 작업을 수행하고 있지 않습니까?

extern기호가 존재하며 특정 유형이라고 선언하고 해당 기호에 대한 저장소를 할당하지 않기 때문에 필요합니다.

사용할 경우:

int foo;

여러 소스 파일 간에 공유되는 헤더 파일의 경우 각 소스에 고유한 foo 복사본이 생성되고 링커가 기호를 해결할 수 없으므로 링커 오류가 발생합니다.

대신 다음이 있을 경우:

extern int foo;

헤더에서는 각 소스 파일의 다른 곳에 정의된 기호를 선언합니다.

소스 파일 하나(단 하나)에 포함됨

int foo;

이것은 링커가 해결할 단일 foo 인스턴스를 만듭니다.

아니요. #include는 "이 다른 파일의 모든 텍스트를 여기에 입력합니다."라는 전처리기 명령어입니다.따라서 포함된 파일의 모든 함수와 변수는 현재 파일에 정의되어 있습니다.

#include preprocessor 명령어는 포함된 파일의 텍스트를 현재 파일의 현재 위치에 복사/붙여넣기만 하면 됩니다.

external은 변수 또는 함수가 이 소스 파일의 외부에 존재함을 표시합니다.이 작업은 발신자가 수행하고("이 데이터를 외부에서 사용할 수 있도록 합니다"), 수신자가 수행합니다("필요한 외부 데이터가 있음을 표시합니다").외부가 만족스럽지 않은 수신자는 정의되지 않은 기호 오류를 발생시킵니다.

어떤 걸로 할까요?인크루드 가드 패턴과 함께 #include를 사용하는 것을 선호합니다.

#ifndef HEADER_NAME_H
#define HEADER_NAME_H
<write your header code here>
#endif

이 패턴을 사용하면 이중 포함 오류에 대한 걱정 없이 외부인이 접근할 수 있는 모든 항목을 헤더로 깨끗하게 분리할 수 있습니다.사용 가능한 외부를 찾기 위해 .c 파일을 열어야 할 때마다 명확한 인터페이스가 없으면 영혼의 보석에 금이 가게 됩니다.

실제로 번역 단위 간에 함수/변수를 사용하는 두 가지 방법이 있습니다(번역 단위는 일반적으로 *.c/*.cc 파일임).

하나는 앞으로의 선언입니다.

  • 을 사용하여 함수/변수 선언extern호출 파일에 저장됩니다.extern실제로 함수의 경우 옵션입니다(함수는 자동으로 설정됨).extern), 그러나 변수에 대해서는 그렇지 않습니다.
  • 구현 파일에 함수/변수를 구현합니다.

다른 하나는 헤더 파일을 사용하는 것입니다.

  • 을 사용하여 함수/변수 선언extern헤더 파일(*.h/*.hhh)에 입력합니다.여전히,extern함수의 경우에는 선택 사항이지만 변수의 경우에는 선택 사항이 아닙니다.그래서 당신은 평소에 볼 수 없는extern헤더 파일의 함수 앞에.
  • 호출 *.c/*.cc 파일에서 #는 헤더를 포함하고 필요에 따라 함수/변수를 호출합니다.
  • 구현 *.c/*.cc 파일에서 #는 헤더를 포함하고 함수/변수를 구현합니다.

구글 C++ 스타일 가이드는 두 접근법의 장단점에 대해 좋은 논의를 합니다.

개인적으로, 저는 헤더 파일 접근 방식을 선호합니다. 함수 서명이 정의된 단일 장소(헤더 파일)이기 때문에, 호출 및 구현은 모두 이 한 가지 정의에 부합하기 때문입니다.따라서, 전방 신고 방식에서 발생할 수 있는 불필요한 불일치가 발생하지 않을 것입니다.

언급URL : https://stackoverflow.com/questions/1330114/whats-the-difference-between-using-extern-and-including-header-files