extern 저장소 클래스 지정자extern Storage-Class Specifier

extern 저장소 클래스 지정자를 사용하여 선언된 변수는 프로그램 소스 파일의 외부 수준에서 정의된 것과 같은 이름이 지정된 변수에 대한 참조입니다.A variable declared with the extern storage-class specifier is a reference to a variable with the same name defined at the external level in any of the source files of the program. 내부 extern 선언은 블록 내에서 외부 수준 변수 정의를 표시하는 데 사용됩니다.The internal extern declaration is used to make the external-level variable definition visible within the block. 외부 수준에서 다른 방식으로 선언되지 않는 한 extern 키워드를 사용하여 선언된 변수는 자신이 선언된 블록에서만 표시됩니다.Unless otherwise declared at the external level, a variable declared with the extern keyword is visible only in the block in which it is declared.

예제Example

다음 예제에서는 내부 및 외부 수준의 선언을 보여 줍니다.This example illustrates internal- and external-level declarations:

// extern_StorageClassSpecified.c  
#include <stdio.h>  

void other( void );  

int main()  
{  
    // Reference to i, defined below:   
    extern int i;  

    // Initial value is zero; a is visible only within main:   
    static int a;  

    // b is stored in a register, if possible:   
    register int b = 0;  

    // Default storage class is auto:   
    int c = 0;  

    // Values printed are 1, 0, 0, 0:   
    printf_s( "%d\n%d\n%d\n%d\n", i, a, b, c );  
    other();  
    return;  
}  

int i = 1;  

void other( void )  
{  
    // Address of global i assigned to pointer variable:  
    static int *external_i = &i;  

    // i is redefined; global i no longer visible:   
    int i = 16;  

    // This a is visible only within the other function:   
    static int a = 2;  

    a += 2;  
    // Values printed are 16, 4, and 1:  
    printf_s( "%d\n%d\n%d\n", i, a, *external_i );  
}  

이 예제에서 i 변수는 초기 값 1로 외부 수준에서 정의됩니다.In this example, the variable i is defined at the external level with initial value 1. extern 함수의 main 선언은 외부 수준 i에 대한 참조를 선언하는 데 사용됩니다.An extern declaration in the main function is used to declare a reference to the external-level i. 이니셜라이저가 생략되었으므로 static 변수 a가 기본적으로 0으로 초기화됩니다.The static variable a is initialized to 0 by default, since the initializer is omitted. printf에 대한 호출은 1, 0, 0 및 0 값을 출력합니다.The call to printf prints the values 1, 0, 0, and 0.

other 함수에서는 static 포인터 변수 external_i를 초기화하는 데 전역 변수 i의 주소가 사용됩니다.In the other function, the address of the global variable i is used to initialize the static pointer variable external_i. 전역 변수에 static 수명이 있으므로, 즉 해당 주소가 프로그램 실행 중 변경되지 않으므로 이것이 가능합니다.This works because the global variable has static lifetime, meaning its address does not change during program execution. 다음으로 i 변수는 초기 값이 16인 지역 변수로 다시 정의됩니다.Next, the variable i is redefined as a local variable with initial value 16. 이 재정의 작업은 해당 이름을 지역 변수에 사용하여 숨겨진 외부 수준 i의 값에 영향을 주지 않습니다.This redefinition does not affect the value of the external-level i, which is hidden by the use of its name for the local variable. 이제 i 포인터를 통해 이 블록 내에서 간접적으로만 전역 external_i의 값에 액세스할 수 있습니다.The value of the global i is now accessible only indirectly within this block, through the pointer external_i. auto 변수 i의 주소를 포인터에 할당할 수는 없습니다. 블록에 들어갈 때마다 달라질 수 있기 때문입니다.Attempting to assign the address of the auto variable i to a pointer does not work, since it may be different each time the block is entered. a 변수는 static 변수로 선언되고 2로 초기화됩니다.The variable a is declared as a static variable and initialized to 2. 내부 수준에서 static 변수는 이 변수가 선언된 블록 내에서만 표시되기 때문에 이 amain에 있는 a와 충돌하지 않습니다.This a does not conflict with the a in main, since static variables at the internal level are visible only within the block in which they are declared.

a 변수는 2씩 증가하여 4가 됩니다.The variable a is increased by 2, giving 4 as the result. other 함수가 동일한 프로그램에서 다시 호출될 경우 a의 초기 값은 4가 됩니다.If the other function were called again in the same program, the initial value of a would be 4. 내부 static 변수는 프로그램이 종료 후 해당 변수가 선언된 블록에 다시 들어가도 값을 유지합니다.Internal static variables keep their values when the program exits and then reenters the block in which they are declared.

참고 항목See Also

내부 수준 선언에 대한 저장소 클래스 지정자Storage-Class Specifiers for Internal-Level Declarations