2017-04-04 1 views
0

Visual Studio 2015에서 두 개의 C 프로젝트를 준비했습니다. 첫 번째 프로젝트는 정적 라이브러리 프로젝트이고 두 번째 프로젝트는 첫 번째 프로젝트에서 생성 한 정적 라이브러리 파일을 사용하는 콘솔 응용 프로그램입니다.캡슐화를 위해 생성 된 라이브러리를 확인하십시오.

Windows에서 DUMPBIN 도구를 사용하여 정적 라이브러리 파일을 검사 한 결과 많은 변수와 함수가 외부에 노출되어 캡슐화 문제에 매우 나쁜 것으로 나타났습니다.

제 질문은 개인이되어야하는 기능을 공개하지 않도록 어떻게 확신 할 수 있습니까? 해당 도구로 매번 확인해야합니까? 내 질문은 또한 변수를 다루고있다. 모든 정적 전역 변수도 외부에 노출됩니다. 어떻게 그들을 비공개로 만들 수 있습니까?

+0

내부 연결 고리가있는 이름은 정의에 의해 외부에서 사용할 수 없어야합니다. 라이브러리가 여러 컴파일 단위로 구성된 경우에는 내부 선언을 제공하지 마십시오. – Olaf

답변

1

나는 dumpbin 출력의 존재를 "노출"이라고 생각할 수 없다고 생각합니다. 모든 정적 전역 변수는 일부 공간 할당과 런타임시의 초기화를 필요로합니다. 따라서 덤프 출력물에 존재하는 것은 자연스러운 일입니다. 또한 링크 타임 코드 생성으로 컴파일하는 경우 모든 것이 실제로 "노출"됩니다.

+0

아, 매우 유용한 정보. 그렇다면 노출 된 함수와 그렇지 않은 함수를 어떻게 이해할 수 있습니까? – sanchop22

+2

C에서 "공용 인터페이스"를 제공하는 올바른 방법은 공개적으로 사용 가능한 모든 항목에 대한 선언을 포함하는 헤더 파일을 작성하는 것입니다.이 헤더 파일의 사용자가 더 깊이 들어가서 내부 자료를 연결하려고하지 않기를 바랍니다 사고로). 예를 들어, 정적이 아닌 전역 변수 int foo가있는 경우 누군가 extern int foo로 자신의 ".c"파일에 실제로 다시 선언하고 변경할 수 있습니다. 그리고 기능도 마찬가지입니다. 그래서 가능한 모든 내부 물건은 정적으로 선언되어야합니다. 왜냐하면 다른 모든 것들은 외부에서 접근 가능하기 때문입니다. – dodo951

관련 문제