2011-04-12 3 views
2
전역 변수는 두 개의 서로 다른 저장 내 최고의 지식 C에서 클래스와 선언 한이 correspodingly 두 가지 키워드로 주어질 수도 있습니다

통근 선언과 정의

extern int foo; //default 
static int bar; 

정적 변수는있다 선언 모듈 내에서 볼 수 있으며 내보낼 수 없습니다. extern 선언의 경우 변수는 정적 변수에 의해 음영 처리되지 않는 한 연결된 모든 모듈의 공통 네임 스페이스에 있습니다.

정적 변수는 해당 모듈에서 정의해야하지만 extern 변수는 다른 어딘가에서 정의 할 수 있습니다. 사용 된 경우이를 정의해야합니다.

제 컴파일러 (GCC)는

static int bar = 5; 

을 허용하지만, 통근 변수가 키워드 '통근'으로 정의되지 않습니다 것으로 예상 것으로 보인다

extern int foo = 4; 

에 불평 캐스트. 질문

위 예제의 'foo'객체는 정의 된 모듈에 어떤 종류의 저장 클래스가 있습니까?

+3

신고 내용은 무엇입니까? 나는 그것이 여러 번 정의되고 있다고 불평한다고 생각한다. – Skurmedel

+4

"extern"은 실제로 "다른 사람이이 값을 정의한 것입니다."- 따라서 extern 선언에 값을 할당하려고 시도하는 것이 타당하지 않습니다. 당신은 단순히 "int foo = 4;" * 하나 * C 파일, 당신은 괜찮아. – Erik

+1

extern의 값을 설정할 수 없습니다. 인스턴스를 소유하고 있지 않습니다. 정상적으로 선언 한 모듈은 – forsvarir

답변

0

통근 변수가 정의되는 단위의 전역 (반출)로 정의한다 :

INT의 바즈 = 5;

+0

이제 baz는 정적 변수 또는 extern 변수입니까? 둘 다 그렇지 않다면, 그것은 무엇입니까? – shuhalo

+0

은 정의 된 파일에서 정적 변수입니다. 다른 합병증 단위에서는 extern입니다. 변수를 정적으로 정의하면서 해당 범위를 로컬 컴파일 단위로 제한하는 "정적"키워드의 사용과 혼동하지 마십시오. " – gby

0

기본 저장 클래스는 auto입니다.

2

IIRC, extern은 값에 대한 저장소를 할당 할 필요가 없다는 점을 컴파일러에 알리는 역할을합니다. 링커는 다른 컴파일 단위에서 값을 찾을 것으로 예상됩니다. 보통 extern은 헤더 파일에 누군가가 이름과 연관된 저장소를 정의했음을 나타 내기 위해 사용됩니다. 값의 정의에는 extern 키워드가 포함되지 않습니다. 컴파일러는 정의를 포함하는 컴파일 단위의 값에 대한 저장소를 할당해야하기 때문입니다.

자세한 내용은 extern storage class specifier을 참조하십시오.

0

실제로 자동 저장과 등록
등록은 중요하지 않지만 기본 저장 클래스는 auto입니다.
자동 변수는 메모리 어딘가에 저장됩니다 (일반적으로 변수를 선언 할 때 원하는 값). 'auto variables'의 경우 변수의 범위가 입력 될 때마다 새로운 공간이 할당된다는 점에 유의해야합니다. (즉, func() 함수에서 func()를 호출 할 때 func()가 'auto'변수를 선언하면 두 개의 다른 변수가 생기고 func()를 호출 할 때마다 해당 변수에 대해서만 알 수 있습니다.
정적 변수는 항상 유일한 것으로 공간이 한 번만 할당된다는 점에서 독특합니다. func()가 func()를 호출 할 때 유용합니다.() 당신은 두 기능은 같은 변수에서 작동하도록 호출합니다.
외부 입력 변수는 고유의 변수 단순히 참조입니다.
다른 파일에서 선언 된 전역 변수에 액세스하려는 경우 다음을 사용합니다.
파일을 감안할 때 1.c 및 2.c "int global"을 선언하는 것으로 충분하지 않습니다. 두 파일에서 공간이 두 번 할당되고 이름 충돌로 인해 연결 오류가 발생하기 때문입니다.
따라서 당신은 "int global;"을 사용하여 공간을 확보하고 다른 파일에서 "extern int global;"을 작성하여 다른 파일에서 "global"이라는 이름의 변수를 찾기 위해 링커에 지시합니다. ".