C_역할 영역, 링크 속성 및 저장 유형

7034 단어 C 언어
1. 역할 영역
1.1 개요
변수는 프로그램의 어느 부분에서 성명할 때 프로그램의 일정한 구역 내에서만 접근할 수 있고 이 구역은 작용역이 된다.작용역은 파일 작용역, 함수 작용역, 코드 블록 작용역과 원형 작용역으로 네 가지로 나뉜다.컴파일러는 변수가 성명한 위치를 통해 작용역을 확정한다
1.2 파일 역할 영역
변수가 모든 코드 블록 밖에서 성명될 때 파일 역할 영역에 있고 파일 역할 영역의 범위는 변수 성명에서 파일의 끝까지 이어집니다.그러나 ".h"파일에 선언이 있고 해당 파일이 다른 파일에 #include로 포함되어 있으면 해당 변수의 역할 영역도 파일을 포함하는 끝으로 확대됩니다.
1.3 함수 역할 영역
함수 작용역은 문장 라벨에만 적용되고 문장 라벨은 goto 문장에 사용됩니다.함수 역할 영역 내의 문장 라벨은 유일해야 합니다.
1.4 코드 블록 역할 영역
한 쌍의 괄호 사이의 모든 문장은 코드 블록 작용역이 된다.하나의 코드 블록 역할 영역에서 정의된 변수는 이 코드 블록 내의 모든 문장에 사용할 수 있습니다.다음은 두 가지 상황을 고려한다. 코드 블록 사이의 끼워넣기
{
    int a = 100;
    {
        int a;
    }
}

이때 내층의 a는 외층의 a를 숨긴다. 만약에 내층 a의 값을 수정하면 외층의 a에 영향을 주지 않는다.
끼워 넣지 않은 두 개의 코드 블록이 만약 두 개의 코드 블록 사이에 교집합이 없다면, 한 코드 블록의 안의 문장은 다른 코드 블록 내의 변수를 사용할 수 없다.
1.5 원형 작용역
원형 작용역은 함수 성명에 있는 매개 변수 이름에 적용됩니다.
2. 링크 속성
2.1 개요
링크 속성은 서로 다른 파일에 있는 식별자를 어떻게 처리하는지 결정합니다.링크 속성은 모두 세 가지가 있는데 그것이 바로 external(외부), 인터넷(내부), none(없음)이다.
  • 링크 속성이 none인 식별자는 그 파일 안에 있든 없든 독립된 개체이다.
  • 링크 속성이 인터넷인 식별자가 같은 원본 파일에 있는 모든 성명은 같은 실체를 가리킨다
  • 링크 속성이 external인 표지부호는 몇 번을 성명하든지 상관없이 몇 개의 원본 파일에 위치하면 같은 실체가 파일 작용 영역에서 성명하는 변수나 함수를 나타낸다. 부족한 조건에서 링크 속성은 external이고 나머지는none
  • 이다.
    2.2 extern 키워드
    externa 키워드를 사용하여 변수를 설명하면, 이 변수가 다른 곳에서 정의되었음을 설명하고, 다른 파일에 있을 수도 있고 현재 파일에 있을 수도 있습니다.이 키워드는 식별자의 링크 속성을 external로 설정합니다
    2.3 static 키워드
    만약 식별자의 링크 속성이 external이라면static는 링크 속성을 인터넷으로 바꿀 수 있습니다
    2.45개의 실험
    실험1
    //test1.c
    int a = 100;
    
    void printfa1()
    {
        printf("The value of a in test1 : %d", a);
    }
    //test2.c
    
    int a = 20;
    
    void printfa2()
    {
        printf("The value of a in test2 : %d", a);
    }
    //main.c
    #include <stdio.h>
    #include <stdlib.h>
    
    void printfa1();
    void printfa2();
    
    int main()
    {
        printfa1();
        printfa2();
        return 0;
    }

    컴파일러 오류: multiple definition of'a'결론: 서로 다른 파일에 같은 이름의 식별자를 포함할 수 없습니다
    실험2 테스트 2.c의 a에 extern 표식자 추가
    //test1.c   
    //test2.c
    
    extern int a;
    
    void printfa2()
    {
        printf("The value of a in test2 : %d
    "
    , a); } //main.c #include <stdio.h> #include <stdlib.h> void printfa1(); void printfa2(); int main() { printfa1(); printfa2(); extern int a; a = 10; printfa1(); printfa2(); return 0; }

    컴파일링을 통해 100과 10을 성공적으로 출력한 것은 3개의 a가 모두 하나의 변수로 결론을 내렸다는 것을 의미한다. extern 키워드를 통해 다른 파일에 정의된 변수에 접근할 수 있다. extern 수식 변수를 사용할 수 없는 동시에 이 변수에 초기 값을 부여하면 컴파일러도 오류를 보고할 수 있다.
    error: ‘XX’ has both ‘extern’ and initializer

    그 이유는 이 변수가 실제적으로 다른 곳에서 정의되었기 때문에 그에게 초치를 부여할 수 없기 때문이다.
    실험3 테스트1.c의 a는static로 수식하고 다른 파일은 변하지 않으며 컴파일은 통과할 수 없습니다.static로 수식한 변수는 성명된 파일에만 사용할 수 있음을 설명하고test1을 계속 수정합니다.c、test2.c와main.c
    //test.c
    
    static int a = 100;
    
    void printfa1()
    {
    
        extern int a;
        printf("The value of a in test1 : %d
    "
    , a); } //test2.c int a = 9; void printfa2() { printf("The value of a in test2 : %d
    "
    , a); } //main.c #include <stdio.h> #include <stdlib.h> void printfa1(); void printfa2(); int main() { printfa1(); printfa2(); extern int a; a = 10; printfa1(); printfa2(); return 0; }

    출력 100 9 100 10 은 static 로 수식된 변수 가 외부 에 접근할 수 없고 외부 파일 의 동명 변수 를 사용할 수 없다는 것 을 설명한다
    실험4 테스트 수정 1.c의 printfa1 함수,static로 수식
    //test1.c
    
    static int a = 100;
    
    static void printfa1()
    {
    
        extern int a;
        printf("The value of a in test1 : %d
    "
    , a); }

    컴파일 오류,main 함수의 printfa1에 정의되지 않았습니다. 이 함수는 정의된 파일에서만 사용할 수 있음을 설명합니다
    3. 저장 유형
    3.1 개요
    저장 유형은 일반 메모리, 운행 시 메모리와 하드웨어 레지스터로 나뉜다.
  • 코드 블록 이외에 성명된 변수는 항상 정적 메모리에 저장된다. 이런 변수를 정적 변수라고 부른다.이 변수의 저장 형식을 바꿀 수 없습니다.이 변수는 프로그램이 실행되기 전에 만들어지고 전체 프로그램이 실행될 때 끝날 때까지 존재합니다.
  • 코드 블록에 표시된 변수는 자동으로 창고에 저장됩니다.함수가 호출될 때마다 이 변수의 저장 위치가 다를 수 있습니다.만약 static로 함수 내의 변수를 수식한다면, 그를 정적으로 바꿀 수 있지만, 이것은 이 변수의 작용역을 바꾸지 않을 것이다. 단지 매번 함수가 호출될 때마다 이 변수의 값이 지난번 함수가 끝나지 않았을 때의 값일 뿐이다.
  • register로 장식된 변수로 레지스터 변수가 되며, 보통 이런 변수의 접근 속도는 메모리에 있는 변수보다 빠르다.

  • 4.static 키워드
    static가 코드 블록 이외에 사용될 때,static는 식별자의 링크 속성을 수정하는 데 사용되며, external에서 static로 변경되며,static가 코드 블록 내부를 사용할 때,static는 식별자의 저장 형식을 수정하고, 자동 변수에서 정적 변수로 변경합니다

    좋은 웹페이지 즐겨찾기