Program Club

C ++의 정적 변수

proclub 2020. 11. 26. 20:10
반응형

C ++의 정적 변수


헤더 파일의 정적 변수와 클래스에서 선언 된 변수의 차이점을 알고 싶습니다. 헤더 파일에서 정적 변수를 선언하면 범위가 .h 파일 또는 모든 단위로 제한됩니다. 또한 일반적으로 정적 변수는 클래스에서 선언되면 .cpp 파일에서 초기화됩니다. 그렇다면 정적 변수 범위가 2 개의 컴파일 단위로 제한된다는 의미입니까?


실례합니다. 질문에 순서가 맞지 않게 답변하면 이런 식으로 이해하기가 더 쉬워집니다.

헤더 파일에서 정적 변수를 선언하면 범위가 .h 파일 또는 모든 단위로 제한됩니다.

"헤더 파일 범위"와 같은 것은 없습니다. 헤더 파일은 소스 파일에 포함 됩니다. 번역 단위는 헤더 파일의 텍스트를 포함 하는 소스 파일입니다. 헤더 파일에 작성한 내용은 소스 파일을 포함하여 각각에 복사 됩니다.

따라서 헤더 파일에 선언 된 정적 변수는 각 개별 소스 파일의 정적 변수와 같습니다.

변수를 선언하기 때문에 static이 방법은 내부 연결을 의미한다, 모든 번역 단위 #include헤더 파일을 보내고는 얻을 자신 , 개인 (외부에서 볼 번역 단위 없음) 변수를. 이것은 일반적으로 원하는 것이 아닙니다.

헤더 파일의 정적 변수와 클래스에서 선언 된 변수의 차이점을 알고 싶습니다.

클래스 선언에서 클래스의 static모든 인스턴스 가이 멤버 변수를 공유 함을 의미 합니다. 즉,이 유형의 객체가 수백 개있을 수 있지만 이러한 객체 중 하나가 static(또는 "클래스") 변수를 참조 할 때마다 모든 객체에 대해 동일한 값입니다. "클래스 글로벌"로 생각할 수 있습니다.

또한 일반적으로 정적 변수는 클래스에서 선언되면 .cpp 파일에서 초기화됩니다.

네, 하나 (단 하나 ) 번역 단위는 클래스 변수를 초기화해야합니다.

그렇다면 정적 변수 범위가 2 개의 컴파일 단위로 제한된다는 의미입니까?

내가 말했듯이:

  • 헤더는 컴파일 단위가 아닙니다.
  • static 상황에 따라 완전히 다른 것을 의미합니다.

전역 static은 번역 단위로 범위를 제한합니다. 클래스 static는 모든 인스턴스에 전역을 의미합니다.

이게 도움이 되길 바란다.

추신 :static 내부 연결을 나타내는 데 C ++에서 사용해서는 안되는 방법에 대한 Chubsdad의 답변의 마지막 단락을 확인하십시오 . (그가 옳기 때문에. ;-))


헤더 파일의 정적 변수 :

말은 'common.h'있다

static int zzz;

이 변수 'zzz'에는 내부 연결이 있습니다 (이 동일한 변수는 다른 번역 단위에서 액세스 할 수 없음). 를 포함하는 각 번역 단위에는 'common.h'고유 한 name 객체가 'zzz'있습니다.

클래스의 정적 변수 :

클래스의 정적 변수는 클래스의 하위 개체의 일부가 아닙니다. 클래스의 모든 개체가 공유하는 정적 데이터 멤버의 복사본은 하나만 있습니다.

$ 9.4.2 / 6- "네임 스페이스 범위에있는 클래스의 정적 데이터 멤버는 외부 연결 (3.5)을 갖습니다. 로컬 클래스에는 정적 데이터 멤버가 없어야합니다."

하자의 말은 그래서 'myclass.h'있다

struct myclass{
   static int zzz;        // this is only a declaration
};

그리고 myclass.cpp가지고

#include "myclass.h"

int myclass::zzz = 0           // this is a definition, 
                               // should be done once and only once

그리고 "hisclass.cpp"가지고

#include "myclass.h"

void f(){myclass::zzz = 2;}    // myclass::zzz is always the same in any 
                               // translation unit

그리고 "ourclass.cpp"가지고

#include "myclass.h"
void g(){myclass::zzz = 2;}    // myclass::zzz is always the same in any 
                               // translation unit

따라서 클래스 정적 멤버는 2 개의 번역 단위로만 제한되지 않습니다. 번역 단위 중 하나에서 한 번만 정의하면됩니다.

참고 : 파일 범위 변수를 선언하기 위해 '정적'을 사용하는 것은 더 이상 사용되지 않으며 이름이 지정되지 않은 네임 스페이스는 우수한 대안입니다.


A static variable declared in a header file outside of the class would be file-scoped in every .c file which includes the header. That means separate copy of a variable with same name is accessible in each of the .c files where you include the header file.

A static class variable on the other hand is class-scoped and the same static variable is available to every compilation unit that includes the header containing the class with static variable.

참고URL : https://stackoverflow.com/questions/3698043/static-variables-in-c

반응형