본문 바로가기
C

extern와 static (키워드)

by yororing 2024. 6. 24.

00 개요

  • C 언어 파일 및 SWIG 인터페이스 파일에서 등장해서 정리하고자 함

01 extern 키워드란

1. 정의

  •  'external' '외부적인'
  • 어느 한 파일에서 다른 파일에 정의된(defined) 변수/함수(variable or function)을 참조할 때 사용
  • 즉, 다른 파일에 있는 전역 함수를 참조하는 것

1) Declaration vs Definition (선언과 정의)

  • 참조: 2024.06.24 - [C] - Declaration vs Definition (선언과 정의)  
  • Declaration: A declaration simply informs the program that a variable/function exists somewhere within the program, providing info about its type (for variables) and its arguments and return type (for functions). Declarations do not allocate memory
  • Definition: A definition encompasses everything that a declaration does but goes a step further by allocating memory (for variables) or providing the implementation (for functions). A definition is a superset of a declaration.
  • 가장 큰 차이점: 메모리 할당 여부

2. 문법

extern data_type variable_name;
  • 예시
#include <stdio.h>

extern int a // extern int var: declaration
             // int var: declaration + definition
             
int main() {
    printf("%d", a);
    return 0;
}

3. 기능 설명 (예시 참조)

  • extern some_data_type some_variable_name;와 같은 문장을 사용하여 extern 변수 선언 시
    • 변수에 메모리 할당되지 않고 변수의 속성 및 타입을 할당하는 것
    • 이렇게 하는 것은 해당 프로그램 어딘가에 해당 변수가 정의되었다는 것을 컴파일러에게 알려주는 것
    • 같은 파일 내에서 extern 변수를 여러 번 선언하는 것 가능 (반면 automatic/local 변수는 한 번만 선언 가능)
  • extern 변수의 역할은 현재 파일 외부 어딘가에 해당 변수의 정의 (definition)가 존재한다고 컴파일러에게 알려주는 것
    • 컴파일러는 이 정보에 의지하여 컴파일 실행 시 error을 내지 않음
    • 프로그램 안 다른 어딘가에 해당 변수가 정의되었다는 것을 ensure하는 것은 linker의 책임/역할임
    • linker가 extern 변수와 매칭되는 정의를 찾지 못할 경우 error 발생시킴
    • extern 변수가 초기화되면(initialized) 메모리가 할당되며 정의(defined)되었다고 간주됨
    • 변수의 초기화는 일반적으로 소스 코드 안에서 해당 변수가 초깃값을 (initial value)을 받았을 때 일어남
  • NOTE: 변수는 여러 번 선언될 수 있지만 한 번만 정의될 수 있음 

02 static 키워드란

1. 정의

  • '정적인'
  • 해당 전역 변수의 사용 범위변수를 선언한 소스 파일로 제한하고 싶을 때 사용
  • → static 변수로 선언/정의 시 다른 파일에서 extern 키워드로 참조 불가능
  • 같은 이름의 전역 변수를 다른 소스파일에서 선언해도 오류가 발생 안함 
  • → 해당 소스 파일 내에서만 제한되는 전역 변수
  • 설명 예시)
// example1.c
int g_data1 = 0;
static int g_data2 = 0;
static int g_data3 = 0;

// example2.c
int g_data1; // 오류 발생, 이유: 해당 프로그램 내 같은 이름의 전역 변수 존재
int g_data2; // 오류 발생 X, 이유: 별개의 전역 변수
extern int g_data3; // extern을 통한 참조 불가능

1) Local vs Global Variable (지역 vs 전역 변수)

  • 참조: 2024.06.24 - [C] - Local vs Global Variable (지역 vs 전역 + static 변수)
  • Local Variable (지역 변수): 특정 블록 { }에서 선언된 변수, 블록 내에서만 사용 가능하며 메모리 stack영역에 저장
  • Global Variable (전역 변수): 프로그램 모든 곳에서 쓰이며 메모리 data영역에 저장
  • Static 지역 / 전역 변수: 
    • static 지역 변수: 함수 내에서 선언되어 함수 호출이 끝나도 값을 유지함 
    • static 전역 변수: 다른 전역 변수와 마찬가지로 프로그램이 종료될 때까지 값을 유지함 
    • static 변수: 선언된 블록에서만 사용 가능, 다른 함수나 블록에서는 접근 불가, 전역 변수와 마찬가지로 초깃값을 지정하지 않으면 0으로 초기화

2) static 변수의 저장공간 (Storage)

  • C 언어에서 static 변수는 BSS 또는 DATA 영역에 저장됨
    • BSS 영역은 초기화되지 않은 데이터를 저장함
    • DATA 영역은 초기화된 데이터를 저장함

2. 문법

// variable
static data_type variable_name
data_type static variable_name
// function()
static function_type function_name()
function_type static function_name()
  • 예시
// 변수
int static callCount = 0;
static int callCount = 0;

// 함수
static void count()
{
    ...
}

void static count()
{
    ...
}

3. 기능 설명

1) Static 변수 예제

  • Static 변수를 사용하지 않은 경우:
#include <stdio.h>

int non_static(void) {
    int cnt = 0;
    cnt++;
    return cnt;
}

int main(void) {
    printf("%d\n", non_static());
    printf("%d\n", non_static());
    return 0;
}

  • 위 소스코드 및 결과값 설명:
    • non_static() 함수 안에 cnt라는 지역 변수가 선언되었으며, 이는 main() 함수에서 non_static() 함수를 호출할 때 비로소 메모리에 할당되며 초기화됨
    • 이후 cnt++ 문을 통해 cnt 변수의 값은 1이 되며, 그 1을 출력하게 됨
  • Static 변수를 사용한 경우:
#include <stdio.h>

int static_test(void) {
    static int cnt = 0;
    cnt++;
    return cnt;
}

int main(void) {
    printf("%d\n", static_test());
    printf("%d\n", static_test());
    return 0;
}

  • 위 소스코드 및 결과값 설명:
    • static이라는 문구가 static_test () 함수 내에 선언된 변수 앞에 추가됨 → 이는 정적 변수로 선언되었음을 의미하며 이는 첨파일 시 아예 메모리에 할당됨
    • cnt 변수는 프로그램이 종료되기 전까지 메모리의 자리를 차지함

참조

  1. (extern 키워드란) https://www.skillvertex.com/blog/extern-keyword-in-c/#extern-keyword-in-c 
  2. (static 키워드란) https://velog.io/@sunw9/2-2.-extern-static-const-키워드-알아보기
  3. (static 키워드 - 2. 문법) https://www.c-programming-simple-steps.com/static-keyword-in-c.html#:~:text=The%20static%20keyword%20in%20C%20is%20a%20storage%2Dclass%20specifier,current%20file%20(compilation%20unit).
  4. (static 키워드 - 3. 기능 설) 
  5.