2011-02-18 5 views
7

정적 변수에는 파일 범위가 있습니다. 헤더 파일의 정적 변수

내가 선언 한 정적 변수가 모두 static int Var1

  • file1.h
  • file1.cpp
  • file2.h
  • file2.cpp : 나는 다음과 같은 두 가지 파일을 말해봐 헤더 파일. file1.hfile2.hmain.cpp 파일에 포함되어 있습니다.

    정적 변수가 파일 범위를 가지므로 서로 충돌하지 않으므로이 작업을 수행했습니다. 하지만 컴파일이 끝나면 충돌이 있음을 발견했습니다.

    이제 정적 변수는 extern 변수처럼 동작합니다. 반면에 두 .cpp 파일에서 정적 변수를 선언하면 잘 컴파일됩니다.

    이 동작을 이해할 수 없습니다.

    어떤 시나리오에서이 시나리오에서 범위와 연결이 작동하는 방법을 설명 할 수 있습니까?

+0

관련, https://wiki.sei.cmu.edu/confluence/display/cplusplus/DCL59-CPP.+Do+not+define+an+ ([헤더 파일에 이름없는 네임 스페이스를 정의하지 마십시오] 참조 이름이없는 + 네임 스페이스 + in + a + 헤더 + 파일) – jww

답변

13

정적 변수는 컴파일 단위에 대해 로컬입니다. 컴파일 단위는 #include 지시어 대신 .h 파일의 내용이 삽입 된 기본적으로 .cpp 파일입니다.

이제 컴파일 유닛에서 동일한 이름의 전역 변수를 두 개 가질 수 없습니다. 이는 귀하의 경우에 발생합니다. main.cppfile1.hfile.h이 포함되어 있으며 두 헤더 각각은 자체 Var1을 정의합니다.

논리적으로 두 변수가 다른 경우 다른 이름을 지정하거나 다른 네임 스페이스에 넣으십시오.

이들은 동일한 변수 인 경우, 별도의 헤더 파일 var1.h로 이동하지 var1.h에서 #include guard 망각 file1.hfile2.h 모두로부터 var1.h을 포함한다.

2

정적 변수 static int Var1은 두 헤더 모두에서 전역 범위에 있고 두 헤더를 모두 main.cpp에 포함한다고 가정합니다. 이제는 사전 처리기가 포함 된 파일의 내용을 main.cpp으로 복사합니다. main.cpp에 동일한 범위에서 두 번 선언 된 Var1이 있으므로 여러 선언 오류가 발생합니다. (즉, 전처리기에 의해 file1.h 및 다른 형태는 file2.h)

각 소스 파일은 개별적으로 컴파일됩니다. 이제는 소스 파일에서 별도로 선언 할 때 각 소스 파일은 동일한 이름을 가진 다른 소스 파일에있는 다른 정적 변수의 존재를 인식하지 못합니다. 따라서 컴파일러는 오류를보고하지 않습니다. 소스 파일간에 변수를 공유하려면 extern으로 표시 할 수 있습니다.

8

정적 변수는 번역 단위 범위 (일반적으로 .c 또는 .cpp 파일)을 가지고 있지만, 파일의 #include 지침은 단순히 복사 텍스트 그대로, 또 다른 번역 단위를 만들지 않습니다.전처리 후이 :

#include "file1.h" 
#include "file2.h" 

이로 바뀝니다 :

/* file1.h contents */ 
static int Var1; 

/* file2.h contents */ 
static int Var1; 

어떤을, 여러분이 알다시피, 유효하지 않습니다.

+0

내 thiniking은 두 개의 컴파일 단위가있을 것입니다. –