"extern"을 공유 할 때 "extern"으로 "extern"을 장식 할 필요가없는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com//questions/24043974

  •  21-12-2019
  •  | 
  •  

문제

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을 적용하면

;"초기화가 실제로 변수를 정의하는 것을 의미하기 때문에 컴파일러가 무시하는 것 같습니다.

더보기 : http://en/en.wikipedia.org/wiki/external_variable

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top