"extern"을 공유 할 때 "extern"으로 "extern"을 장식 할 필요가없는 이유는 무엇입니까?
문제
C ++ 도서를 읽는 동안 Const Variable / Object가 여러 파일을 교차시키는 것을 배웠습니다. 파일 중 하나에서 Const 변수를 한 번 정의하고 각 소스 파일에서 사용하는 각 소스 파일에서 선언해야합니다.예를 들어
file1.cpp에서는
와 같이 전역 적으로 const int 변수를 정의합니다extern const int ca = 100;
.
file2.cpp를 사용하는 경우,
와 같은 변수를 선언합니다.extern const int ca;
.
위의 협약은 나를 위해 완벽한 감각을줍니다.그러나 Const char 포인터에 오는 경우 extern을 사용하여 해당 파일을 정의 할 필요가 없으며 여러 파일을 매우 잘 교차 할 수 있습니다.그런 일이 왜 일어나는가?예를 들어
file1.cpp에서
와 같이 전역 적으로 const char pointer 변수를 정의합니다const char *cstr = "hello";
.
file2.cpp를 사용하는 경우,
와 같은 변수를 선언합니다.extern const char *cstr;
.
제 질문을 더 구체적으로 만들려면 file2.cpp에서 "extern"으로 장식되지 않더라도 CSTR을 파일 2.CPP에서 사용할 수 있습니까?
많은 감사
해결책
문제는 연결 중 하나입니다.변수를 정의 할 때 네임 스페이스 범위가 있고 이전 선언은 없습니다. 링크를 설정하고, 오브젝트가 아닌 경우 링크 const, 내부적 인 경우.그래서 당신이 쓸 때 :
int const ca = 100;
.
소스 파일에서 링키지가 내부 및 엔티티가됩니다.
(변수) ca
는 해당 번역에 고유하게 될 것입니다.
단위.당신이 작성한 경우 :
int ca = 100;
.
링키지는 외부적이므로
extern int ca;
.
다른 번역 단위의 은 동일한 변수를 참조합니다.
및 물론, 당신이 쓸 때 :
char const* cstr = "hello";
.
const가 아닌 포인터를 정의합니다. 포인트를 지적합니다).
물론, 일반적으로 헤더의 변수를 선언하고,
extern
를 사용하면 이전에 선언 할 때 이전에 선언이있을 것입니다.
변수를 정의하고 첫 번째 선언입니다.
연결을 설정합니다.
다른 팁
extern은 "extern const char * cstr;"명령문을 명시 적으로 노리키는 데 사용됩니다.정의가 아닌 선언이 아니라 CSTR은 다른 곳에서 정의됩니다.당신이 "const char * cstr;"컴파일러는 정의로 해석하고 2 개의 CSTR 변수로 끝납니다.
"const char * cstr="hello "에 extern을 적용하면
;"초기화가 실제로 변수를 정의하는 것을 의미하기 때문에 컴파일러가 무시하는 것 같습니다.