2012-05-17 2 views
2

외부 연결이있는 심볼 (전역 네임 스페이스 혼란/충돌 제외)에 단점이 있습니까? 예를 들어 필자는 함수 호출자가 절대로 호출하지 않고 내부 링키지가 있으면 컴파일러에서 그냥 버릴 수 있다고 생각할 것입니다.하지만 외부에서 컴파일러가 코드를 남겨 두어야 할 이유는 나중에 링크 할 수 있기 때문입니다 . 이 올바른지? 다른 단점이 있습니까?외부 링크 단점

정적 키워드 대신 이름없는 네임 스페이스를 사용하는 것이 좋지만 이름없는 네임 스페이스의 기호는 여전히 외부 연결을 가지고 있으므로 위에서 언급 한 단점 (내가 옳은 경우)과 그래서 표준처럼 정적 함수보다 완전히 좋지는 않습니다.

답변

2

이름없는 네임 스페이스의 함수가 외부와 연결되어 있다는 사실은 거의 전적으로 기술적 인 부분입니다. 그들은 "비밀"번역 단위 종속 고유 식별자가 있기 때문에 다른 번역 단위에서 그들을 이름을 지정하는 것은 불가능합니다. 이것은 컴파일러가 다른 번역 단위의 이름으로 호출되지 않는다고 가정 할 수 있음을 의미합니다. 필자가 알고있는 대부분의 구현은 진정한 내부 연결을 가진 함수처럼 이름없는 네임 스페이스의 함수를 전역 심볼이 아닌 로컬 심볼로 변환합니다.

정의되지 않은 네임 스페이스의 함수는 프로그램이 정의 된 변환 단위에서 절대 호출되지 않고 번역 단위에서 가져 와서 전달 단위로 전달되지 않는 경우 프로그램에 영향을주지 않고 삭제할 수 있습니다 직접 명명 된 함수 호출이 아닌 다른 호출됩니다.

+0

* 이름이없는 네임 스페이스의 함수는 프로그램에 영향을주지 않고 삭제할 수 있습니다. * - 네, 그렇습니까? 컴파일러가 실제로이 작업을 수행한다는 것을 알고 있습니까? – baruch

+0

@baruch : 예, gcc는 최적화 수준> ='-O1'에서이 작업을 수행합니다. –