2014-09-19 6 views
0

두 개의 다른 소스 파일에서 동일한 이름을 사용하여 static variables을 정의한 코드를 실행하고 컴파일 해 보았습니다. 코드가 성공적으로 컴파일되고 실행되었습니다.다른 파일에 같은 이름의 정적 변수

이제 내 정적 변수는 모두 정적 변수에 있습니다. data/BSS 섹션이 메모리에 있습니다. 내 이해에 따라 두 개의 서로 다른 메모리 위치에는 별도의 고유 한 이름 식별자가 있어야합니다. 이 경우 왜 이것이 문제가되지 않았습니까?

+0

정적 변수는 지역 변수이므로 내 보내지 않을 것입니다. – HuStmpHrrr

+0

요청하기 전에 SO 사이트를 검색하십시오. –

답변

2

"내 이해에 따라 서로 다른 두 개의 메모리 위치에는 별도의 고유 한 이름 식별자가 있어야합니다." -이 경우 "메모리 위치"가 의미하는 바가 명확하지 않습니다. 메모리 위치에는 이름이 아닌 주소가 있습니다. "메모리 위치"가 "개별 변수"인 경우 위의 명령문은 외부 링크가있는 변수에만 적용됩니다. 외부 연결이있는 변수는 외부에서 볼 수있는 이름이 필요합니다. 내부 변수가있는 연결 변수 (정적 변수)는 없습니다.

일반적인 구현에서 모든 정적 기호는 컴파일 단계에서 컴파일러에서 내부적으로 확인됩니다. 객체 파일에 외부 이름을 생성하지 않습니다. 즉 링커에 전혀 노출되지 않습니다. 가장 간단한 경우 동일한 번역 단위의 모든 정적 변수는 링커에서 데이터의 단일 한 묶음으로 보입니다.

서로 다른 번역 단위를 연결하여 결합 할 때까지는 모든 정적 변수 이름이 더 이상 필요하지 않습니다. 그때까지 그들은 오랫동안 잊혀졌다. 그래서 명명 충돌이 발생할 가능성이 없습니다.

P. C++ 언어에서 외부 링키지를 가진 인라인 함수는 정적 변수를 정의 할 수 있습니다. 적절한 기능을 제공하기 위해 컴파일러는 일반적으로 정적 변수에 외부 이름을 할당합니다. 인라인 함수를 지원하는 C 언어는이 문제를 다르게 처리하기로 결정했습니다. C 언어에서 인라인 함수 정의는 정적 변수 정의를 포함하는 것이 단순히 금지됩니다.

+0

설명해 주셔서 감사합니다. 당신의 대답에서 알 수있는 한, 당신은 정적 변수가 연결 시간에 해결되지 않는다는 것을 의미합니다. 정적 변수를 변환 단위 (소스 파일) 외부에서 정의 할 수 없으므로 컴파일시에 해결됩니다. –

관련 문제