2010-02-22 7 views
0

다른 파일에서 정적 변수에 액세스하려면 어떻게해야합니까? 정적 변수에 파일 범위가 있습니까?다른 파일에서 정적 변수에 어떻게 액세스 할 수 있습니까?

bash-3.2$ ls 
a.c b.c 

bash-3.2$ cat a.c 
#include <stdio.h> 
static int s = 100; 
int fn() 
{ 
/* some code */ 
} 

bash-3.2$ cat b.c 
#include <stdio.h> 
#include "a.c" 
extern int s; 
int main() 
{ 
printf("s = %d \n",s); 
return 0; 
} 

bash-3.2$ gcc b.c 

bash-3.2$ a.exe 
s = 100 
+0

파일 범위 만 있고 다른 파일에서 액세스 할 수없는 정적 변수의 정의를 위반하거나 무시하지 않습니까? – aks

+3

* 결코 * * .c, * .cpp 등의 파일을 헤더로 포함하지 마십시오. –

답변

5

그것은 별도의 파일에서, 그러나 당신이 인쇄하는 것은 별도의 번역 단위에서 아닙니다 같이 #includeb.c에서 a.c의 전체.

static 개체는 번역 단위에 국한되어 있습니다.이 개체는 모든 포함 된 파일로 구성되며 단일 원본 파일이 아닙니다.

+0

정적 변수에 파일 범위가 있습니까? – aks

+0

@aks : 아니요, 소스 파일을 의미하는 것은 아닙니다. –

+2

#include는 다른 언어에서 지원하는 "가져 오기"또는 유사 언어와 동일하지 않습니다. 이는 "헤더"파일 외에 잘라 붙이기로 하나의 소스 파일을 만드는 것과 같습니다. 여러 개의 컴파일 단위를 함께 연결하는 것과 같지 않습니다. 즉, 링커를 사용하여 컴파일러에서 생성 한 객체 파일을 소스 파일과 결합합니다. 단일 소스 파일의 경우 일반적으로 쉽게 만들 수 있습니다. 두 개 이상의 파일은 어렵지 않지만 컴파일러 옵션 등을 알아야하거나 IDE를 찾아야합니다. – Steve314

6

하나의 파일을 다른 파일에 포함 시켰습니다. 매우 나쁜 습관입니다. C 전처리 기가 a.c의 내용을 b.c에 삽입하기 때문에 C 컴파일러의 관점에서 두 파일 모두 하나의 변환 단위를 형성합니다.

번역 단위가 두 개인 경우 하나의 단위는 다른 번역 단위의 static에 액세스 할 수 없지만 귀하의 경우는 아닙니다.

#include "a.c" 줄을 제거하고 컴파일해야하는 경우 : gcc a.c b.c이어야하며 s에 대해 unresolved external 오류가 발생합니다.

+0

파일 범위 만 갖고 다른 파일에서 액세스 할 수없는 정적 변수의 정의를 위반하거나 우회하지 않습니까? – aks

+0

정적 범위는 번역 단위로 제한됩니다. 귀하의 경우 두 파일 모두 하나의 번역 단위입니다. – qrdl

+1

일반적으로 전적으로 동의합니다. 헤더와 달리 소스 파일을 포함하지 마십시오. 그러나 소스 파일을 포함하여 소스 파일의 내부 테스트는 테스트 코드에 보이지 않는 코드 (변수 및 함수)에 대한 액세스 권한을 제공하며 매우 유용 할 수 있습니다. 그러나 그것은 매우 전문화 된 맥락입니다. –

관련 문제