2016-09-03 6 views
0

전역 변수에 대한 내용은 C입니다. extern 키워드에 대해 두 가지 질문이 있습니다. 왜 초기화 변수에 필요한C에서 extern 키워드의 동작

  1. 세계적으로extern 키워드 을 선언인가?
  2. 전체적으로 선언 된 변수에 대해 초기화가 필요하지 않은 이유는 extern 키워드가 없습니까?

차이점을 설명하십시오.

+0

정의가 확실합니까? 'extern SomeType some_variable; '은 변수를 선언하기 위해 헤더 파일에서 초기화없이 사용되며'SomeType some_variable = {...};'은 하나의 소스 파일에서 변수를 정의하고 초기화하는 데 사용됩니다. 그건 네가 주장하는 것과는 정반대 인 것 같다. [C에서 소스 파일간에 변수를 공유하려면 어떻게'extern '을 사용합니까?] (http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables-between-source)를 참조하십시오. -files-in-c /)를 사용합니다. 두 개의 이전 중지 지점 중 하나에서 읽기를 중지하십시오 (표시됩니다). –

+0

extern 변수에는 초기화가 필요 없습니다. extern 변수는이 파일에 명시 적으로 정의되지 않고 대신이 객체와 링크 될 다른 객체 파일에 정의 된 변수에 대한 참조입니다. –

답변

-1

이 extern 키워드로 전역 적으로 선언 된 변수에 초기화가 필요한 이유는 무엇입니까?

우리가 초기화되지 않은 변수 컴파일러 통근 키워드를 사용

는 변수가 프로그램에 다른 곳에서 초기화 생각합니다.

#include <stdio.h> 
extern int i; //extern variable 
int main() 
{ 
    printf("%d",i); 
    return 0; 
} 

출력 :

undefined reference to `i' 

때문에, 메모리는 이러한 변수에 할당되지 않은 예를 들어. 따라서 두 번째 경우 컴파일러에서 오류를 알 수없는 기호 i를 표시합니다. 그래서 은 extern 변수에 메모리를 할당하기 때문에 변수을 초기화하는 데 필요합니다. 마찬가지로,

extern int i; 
int i = 10; 

왜 초기화는 통근 키워드없이 전 세계적으로 를 선언 된 변수가 필요하지 않습니다?

extern 키워드를 사용하지 않으면 컴파일러는 기본값으로 초기화합니다.

#include <stdio.h> 
int i; //By default it is extern variable 
int main() 
{ 
    printf("%d",i); 
    return 0; 
} 

출력 : 예를 들어

0 

때문에, 컴파일러는 자동으로 변수를 외부 입력을 기본 값으로 초기화합니다.

2
  1. extern으로 전역 적으로 선언 된 변수에 초기화가 필요한 이유는 무엇입니까?

    // declarations 
    extern int foo1; 
    extern int foo2; 
    

초기화 필요하지 않습니다. 명시 적 초기화가없는 전역 변수는 아래와 같이 초기화됩니다.

변수가이라고 선언하면 으로 정의됩니다. 일부 단위에서 변수를 사용하는 경우 으로 정의해야합니다.

  1. extern없이 전역 적으로 선언 된 변수에는 초기화가 필요하지 않은 이유는 무엇입니까? 명시 적으로 초기화 부족한

    // declaration and definition - no initialization 
    int foo3; // Same functional effect as int foo3 = 0; 
    // declaration and definition - with initialization 
    int foo4 = 5; 
    

전역 변수는 다음과 같이 초기화됩니다. 다음


C11dr 6.7.9 초기화 ... 정적 또는 스레드 저장 기간을 가진 개체를 명시 적으로 초기화되지 않은 경우 :

- 그것은 포인터 타입이있는 경우, 그것은 초기화 널 포인터에;
- 산술 형식 인 경우 (양수 또는 부호가없는) 0으로 초기화됩니다.
- 집계 인 경우 모든 규칙은이 규칙에 따라 (재귀 적으로) 초기화되고 패딩은 0 비트로 초기화됩니다.
- 공용어 인 경우 첫 번째 명명 된 멤버는 이러한 규칙에 따라 (재귀 적으로) 초기화되고 모든 패딩은 0 비트로 초기화됩니다.

+0

@ M.M 초기화 세부 사항이 추가되었습니다. – chux