2014-02-24 2 views
3

내 질문은 공유 라이브러리 (이 라이브러리를 'S'라고 부르 자)에서 생성 된 정적 변수 (정적 void *)에 관한 것이지만 외부에 표시되지 않는 내부 변수이지만 API의 모든 호출은 그것에 달려있다. . 이제 프로그램이 다른 두 개의 공유 라이브러리에 링크되어 있고 그것들 모두가 라이브러리 S와 링크되어있는 경우에 대해 생각해 봅시다. 이제 주 프로그램의 정적 변수는 어떻게됩니까? 하나의 인스턴스가 있습니까? 두?공유 라이브러리 내의 정적 변수

+0

을 '하나 개의 인스턴스가 될 것이다 정적 한 – tarzanbappa

+0

관련으로 선언 이후 : http://stackoverflow.com/questions/3186926/shared-global-variable-in-c-static-library? rq = 1 – Suma

+0

@Suma 언급 한 질문에 대한 대답이 어떻게 도움이됩니까? – zoska

답변

3

정적 변수가 하나의 번역 단위에서만 정의된다고 가정하면 공유 라이브러리는 프로세스에 한 번만로드되므로 한 번만 존재합니다.

sharedstatic 연결의 혼합물이 사용되면 더 어려워 질 것이다.

+0

도와 주셔서 감사합니다. – zoska

0

컴파일러는 동일 변수가 여러 개있는 경우 전역 고정 변수에 대해 다른 인스턴스를 만듭니다.

실제로 컴파일러 (또는 전 처리기)는 선언 한 소스 파일의 이름에 따라 모든 변수의 이름을 암시 적으로 변경합니다.

헤더 파일에 전역 정적 변수를 선언 한 다음이 헤더 파일을 여러 원본 파일에 포함 시켜서이 사실을 증명할 수 있습니다. 각 소스 파일에서 다른 값으로 설정하려고하면이 변수가 각 소스 파일에서 다른 값을 유지한다는 것을 알 수 있습니다.

+0

나는 이것이이 질문에 관한 것이라고 생각하지 않는다. 정적 변수가 코드에 여러 개의 정의를 가지고 있다고 가정 할 이유는 없습니다. – Suma

+0

@Suma : 아래 표를 가져 주셔서 감사합니다. 답변의 맨 아래에있는 제안을 시도해보십시오. 틀린 것을 증명하는 경우이 답변을 삭제하겠다고 약속합니다. –

+0

필자가 작성한 내용을 이해하고 있으며 그 내용이 정확하지만 OP가 머리글이나 여러 번역 단위에서 변수를 정의했다고 가정 할 이유가 없습니다. – Suma

6

스 마의 대답은 정확합니다. 정적 변수의 인스턴스는 하나만 존재합니다. 이것은 또한 공유 라이브러리에 정적 전역을 갖는 것이 큰 문제가 될 수있는 이유이기도합니다. 하나 실제 예제이 일어날 수있는 곳 :

    다음과 같은 모듈로드
  • 아파치 웹 서버 :
    • libxml2를에 연결되어
      • 방법 mod_php
    • mod_perl로드일부 PHP 코드가 libxml2를에 파서 옵션과 같은 글로벌 설정을 수정하는 경우
      • libxml2를

지금, 펄 코드는 이러한 변경 사항을 볼 수 있습니다. 이로 인해 진단하기가 매우 어려운 버그가 발생할 수 있습니다. 따라서 공유 라이브러리의 전역 상태를 피해야합니다.

(libxml2를하면 요즘 로컬에서 대부분의 설정을 할 수 있습니다.)이

+0

도와 주셔서 감사합니다. – zoska

관련 문제