"정적이란 헤더가 둘 이상의 소스 파일에 포함 된 경우 VAL의 사본이 하나만 생성된다는 것을 의미합니까?"라는 질문에 답하기 위해 ...
아니 . VAL은 항상 헤더를 포함하는 모든 파일에서 별도로 정의됩니다.
이 경우 C 및 C ++ 표준이 차이를 유발합니다.
C에서 파일 범위 변수는 기본적으로 extern입니다. C를 사용하는 경우 VAL은 정적이고 ANOTHER_VAL은 extern입니다.
최신 링커는 헤더가 다른 파일에 포함 된 경우 (동일한 전역 이름이 두 번 정의 됨) ANOTHER_VAL에 대해 불평 할 수 있으며 ANOTHER_VAL이 다른 파일에서 다른 값으로 초기화되면 분명히 불평 할 것입니다.
C ++에서 파일 범위 변수는 const 인 경우 기본적으로 정적이고 그렇지 않은 경우 기본적으로 extern입니다. C ++를 사용하는 경우 VAL과 ANOTHER_VAL은 모두 정적입니다.
또한 두 변수가 모두 const로 지정된다는 사실을 고려해야합니다. 이상적으로 컴파일러는 항상 이러한 변수를 인라인하고 저장소를 포함하지 않도록 선택합니다. 스토리지를 할당 할 수있는 이유는 여러 가지가 있습니다. 내가 생각할 수있는 것들 ...
- 디버그 옵션
- 파일에서 가져온 주소
- 컴파일러는 항상 저장소를 할당합니다 (복잡한 const 유형은 쉽게 인라인 될 수 없으므로 기본 유형의 특별한 경우가 됨)