인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Echapper4님의 프로필 이미지
Echapper4

작성한 질문수

홍정모의 따라하며 배우는 C++

4.2 전역 변수, 정적 변수, 내부 연결, 외부 연결

const와 extern

작성

·

390

·

수정됨

1

안녕하세요

const가 변수의 외부연결을 막는 것 같은 상황이 생기는 거 같아 이렇게 여쭤봅니다.

 

파일구조는 vars.cpp -> header.h -> main.cpp&test.cpp입니다.

vars.cpp

header.h

main.cpp

test.cpp

의도한대로 잘 작동하며 출력화면은 아래와 같습니다.

그런데 여기서 vars.cpp에서 nmsp_a변수를 int에서 const int형으로 바꾸고,

header.h에서도 nmsp_a를 extern int에서 extern const int형으로 바꾸고 돌려보면

아래와 같이 오류가 발생합니다.

차이점은 equipe namespace안의 int nmsp_a변수를 그냥 int에서 const int로 바꾼 것 뿐인데 충돌이 일어나는 것처럼 보입니다.

const와의 어떠한 문제 때문인 것으로 추측되는데

 

vars.cpp의 namespace안의 nmsp_a변수에는 extern을 붙이지 않아왔고 nmsp_a를 가져다끌어 쓰는 header.h에서만 extern을 붙여줬는데 아래 사진과 같이

vars.cpp의 nmsp_a 변수에 오류를 발생시키던 const를 붙이되 extern또한 추가로 붙여주면 정상출력을 합니다.

 

const를 안 붙이는 상황에선,

변수를 정의해두는 vars.cpp에서는 extern를 쓰지않고

이를 가져오는 주체인 header.h에만 extern를 붙여도 정상작동했지만

 

const를 붙이는 상황에선,

vars.cpp, header.h 두 곳 모두 각각 변수에 extern을 붙여줘야한다는 결론을 얻었습니다.

 

말이 좀 복잡한데 정리하자면

왜 변수에 const가 없으면

vars.cpp에는 extern을 안 붙여도 되고

왜 변수에 const가 있으면

vars.cpp에도 extern을 꼭 달아줘야하는지

그런 차이가 왜 생기는지 궁금합니다.

 

감사합니다.

답변 1

3

안녕하세요, 질문&답변 도우미 Soobak 입니다.

 

링커가 해당 변수의 외부 연결을 찾지 못하기 때문입니다.

 

기본적으로, const 변수에 extern 을 사용하지 않으면, 그 변수는 내부 연결을 가지게 됩니다.
내부 연결은 강의에서 학습하신 것 처럼, 해당 변수가 선언된 파일 내에서만 접근할 수 있음을 의미하며, 다른 파일에서는 접근할 수 없습니다.
하지만, extern 키워드를 사용하면 해당 변수에 대한 외부 연결을 명시적으로 지정하여, 다른 파일에서도 해당 변수를 사용할 수 있게 됩니다.
따라서, const 변수를 여러 파일에서 공유하고자 할 때는, 변수 선언에 extern 키워드를 명시적으로 추가해주어야 합니다.

 

Echapper4님의 프로필 이미지
Echapper4
질문자

감사합니다

그렇다면 외부로 연결해 쓸 변수는 선언부이든 어디든 무조건 extern을 붙이는 게 원칙이라는 말씀이신 것 같은데

const가 아닌 변수는 선언부에 extern을 생략해도 잘 작동했던 것은 키워드를 생략해서 쓸 수 있던 것이였거나 아니면 특수한 문법이었던걸로 이해해야할까요?

네, const 가 아닌 일반 변수의 경우 기본적으로 외부 연결을 가지기 때문에, 다른 파일에서 해당 변수를 사용하도록 하기 위해 명시적으로 extern 을 사용하지 않아도 됩니다. (일종의 편의성 제공)

언어의 설계 관점에서, 비상수 전역 변수는 기본적으로 외부 연결을 가지지만, 상수 전역 변수는 기본적으로 내부 연결을 가지기 때문입니다.

Echapper4님의 프로필 이미지
Echapper4

작성한 질문수

질문하기