산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C 저장 클래스 이해: auto, extern, static, register 완벽 해설

C에서 저장 클래스(Storage Class)란?

저장 클래스는 변수의 범위(scope), 위치, 초기화, 수명(lifetime), 접근성을 정의합니다. C에서 모든 변수는 타입뿐만 아니라 저장 클래스도 가지며, 이것이 변수가 어디에서 어떻게 접근될 수 있는지를 결정합니다.

표준 저장 클래스는 네 가지입니다:

Auto 저장 클래스

auto로 선언된 변수(지역 변수의 기본값)는 정의된 블록 내에서만 존재합니다. 블록을 벗어나면 소멸하며, 명시적으로 설정하지 않으면 비결정적 값으로 초기화됩니다.

int add(void) {
    int a = 13;
    auto int b = 48; // auto는 선택적
    return a + b;
}

범위 시연:

#include <stdio.h>
int main(void) {
    auto int j = 1;
    {
        auto int j = 2;
        {
            auto int j = 3;
            printf("%d ", j); // 3 출력
        }
        printf("\t%d ", j); // 2 출력
    }
    printf("%d\n", j); // 1 출력
}

출력: 3 2 1

Extern 저장 클래스

extern 키워드는 다른 번역 단위(translation unit)에 정의된 변수나 함수를 선언합니다. 소스 파일 간 데이터 공유를 가능하게 합니다.

/* main.c */
#include <stdio.h>
extern int i; // 선언
int main(void) {
    printf("value of the external integer is = %d\n", i);
    return 0;
}
/* original.c */
#include <stdio.h>
int i = 48; // 정의

두 파일을 함께 컴파일: gcc main.c original.c -o program. ./program 실행 시 출력:

value of the external integer is = 48

Static 저장 클래스

정적 변수는 프로그램 실행 기간 동안 값을 유지합니다. 지역 정적 또는 파일 범위 정적으로 사용 가능.

/* 전역 정적 */
static int counter = 7;
void next(void) {
    /* 지역 정적 */
    static int iteration = 13;
    iteration++;
    printf("iteration=%d and counter=%d\n", iteration, counter);
}
int main(void) {
    while (counter < 10) {
        next();
        counter++;
    }
    return 0;
}

출력:

iteration=14 and counter=7
iteration=15 and counter=8
iteration=16 and counter=9

Register 저장 클래스

자주 접근되고 CPU 레지스터에 들어갈 수 있는 변수에 register 사용. 레지스터가 부족하면 컴파일러가 힌트를 무시할 수 있습니다.

#include <stdio.h>
int main(void) {
    register int weight;
    /* 주소 취득 시도 시 실패 */
    // int *ptr = &weight; // 컴파일 에러
    return 0;
}

컴파일 결과:

error: address of register variable 'weight' requested

요약 표

저장 클래스선언 위치저장 위치기본값범위수명
auto함수/블록 내부메모리불확정함수/블록함수/블록
register함수/블록 내부CPU 레지스터불확정함수/블록함수/블록
extern모든 함수 외부메모리0전체 프로그램프로그램 런타임
static (지역)함수/블록 내부메모리0함수/블록프로그램 런타임
static (전역)모든 함수 외부메모리0파일프로그램 런타임

핵심 요약

C 언어

  1. C# 클래스와 객체: 견고한 OOP를 위한 기초 다지기
  2. C# static 키워드: 정적 변수, 메서드, 클래스 완벽 활용
  3. C# 중첩 클래스(Nested Class) 이해: 정의, 사용법, 상속
  4. C++ 클래스와 객체: 객체지향 프로그래밍 실전 가이드
  5. C++ 프렌드 함수와 프렌드 클래스: 접근 제어 마스터하기
  6. C++ 클래스 템플릿 마스터: 실전 가이드
  7. C 저장 클래스 이해: 범위, 생명주기, 성능
  8. C 저장 클래스 완전 분석: auto, register, static, extern, _Thread_local
  9. C++ 저장 클래스 완벽 가이드: 범위, 수명, 용법
  10. C++ 인터페이스: 추상 클래스와 순수 가상 함수 마스터하기