스택큐힙리스트

C++ 함수에서 extern 키워드. 헤더 파일을 왜 포함하지 않는 것인가요? 본문

카테고리 없음

C++ 함수에서 extern 키워드. 헤더 파일을 왜 포함하지 않는 것인가요?

스택큐힙리스트 2023. 11. 18. 00:19
반응형

내가 올바르게 이해한다면 이 의미는 다음과 같습니다.


extern void foo();

함수 foo가 다른 번역 단위에서 선언되었음을 의미합니다.


1) 이 함수가 선언된 헤더 파일을 #include하는 것이 왜 좋지 않은 건가요?


2) 링커는 링킹 시 함수를 어디에서 찾아야 하는지 어떻게 알까요?


편집: 아마도 위의 선언이 사용하는 함수를 따라온다는 것을 명확히 해야 할지도 모릅니다.


foo();

이 함수는 이 번역 단위에서 정의되지 않았습니다.

답변 1

1) 헤더 파일이 없을 수도 있습니다. 그러나 일반적으로 대형 프로젝트에서는 여러 개의 번역 단위가 해당 함수를 사용할 경우 헤더 파일이 있어야 합니다 (중복을 피하세요).


2) 링커는 함수 및 다른 심볼을 찾기 위해 지정된 모든 개체 파일 및 라이브러리를 검색합니다.

답변 2

C++ extern 키워드는 함수에서 사용됩니다. 왜 헤더 파일을 포함시키지 않을까요?
C++에서 함수를 선언하려면 해당 함수를 헤더 파일에 정의해야 합니다. 이는 해당 함수를 여러 소스 파일에서 공유하기 위해서입니다. 하지만 때로는 헤더 파일을 포함할 필요 없이 함수를 다른 소스 파일에서도 사용할 수 있습니다.
이럴 때 extern 키워드를 사용합니다. extern을 함수 선언 앞에 붙이면 컴파일러에게 해당 함수가 다른 소스 파일에서 정의되어 있다는 것을 알려줍니다. 이렇게 함으로써 컴파일러는 해당 함수가 존재함을 알고, 링킹 단계에서 함수를 찾을 수 있습니다.
그렇다면 왜 헤더 파일을 포함시키지 않고 extern 키워드를 사용하는 걸까요? 이는 몇 가지 이유가 있습니다.
첫째, 헤더 파일을 포함하는 것은 코드 중복을 야기할 수 있습니다. 헤더 파일 안에 함수의 정의와 선언이 함께 있을 경우, 해당 헤더 파일을 여러 소스 파일에서 포함시키면 함수의 정의도 함께 중복되어 컴파일 에러가 발생할 수 있습니다.
둘째, 헤더 파일을 포함하지 않는 것은 컴파일 시간을 단축시킵니다. 헤더 파일에는 많은 정보가 들어 있을 수 있으며, 이를 포함하는 모든 소스 파일은 컴파일할 때 해당 헤더 파일을 열고 내용을 읽어와야 합니다. 이는 컴파일 시간을 증가시키고 빌드 프로세스를 느리게 만들 수 있습니다. extern을 사용하면 헤더 파일을 포함하지 않아도 되므로 컴파일 시간을 줄일 수 있습니다.
쉽게 말해, extern 키워드를 사용함으로써 함수를 다른 소스 파일에서도 사용하면서 중복된 코드를 방지하고, 빌드 속도를 향상시킬 수 있습니다.
C++에서 extern 키워드는 함수 선언에서 왜 헤더 파일을 포함시키지 않아도 되는지를 알려줍니다. 이는 코드 중복을 방지하고 컴파일 시간을 단축시킬 수 있기 때문입니다. 따라서 C++에서 extern 키워드는 헤더 파일을 포함시키지 않는 대안으로 유용하게 사용될 수 있습니다.

반응형
Comments