static 키워드

함수의 static 변수

  • 함수 안에서 선언된 static 변수 값이 고정됨
    • multi-thread
    • hardware interrupt timer
// 함수 정의
void function()
{
  static i = 0;
  print("%d", i++);
  // ...
}

// i값은 0
function();

// i값은 1
function();

모듈의 static 함수

  • 모듈 안 글로벌 함수처럼 접근 가능
  • 다른 모듈에서는 접근 불가
  • localized global
// helper_file.c
int f1(int);        /* prototype */
static int f2(int); /* prototype */

int f1(int foo) 
{
    return f2(foo); /* ok, f2 is in the same translation unit */
                    /* (basically same .c file) as f1         */
}

int f2(int foo) 
{
    return 42 + foo;
}

// main.c:
int f1(int); /* prototype */
int f2(int); /* prototype */

int main(void) {
    f1(10); /* ok, f1 is visible to the linker */
    f2(12); /* nope, f2 is not visible to the linker */
    return 0;
}

모듈의 static 변수

  • 모듈 안 모든 함수에서 이 변수로 접근 가능
  • 다른 모듈에서는 접근 불가
  • localized global variable
// helper_file.c
int a = 10;
static int b = 20;

// main.c
int main()
{
  int new_a = a;
  int new_b = b; /* b is not visible to the linker */
}

C++ 클래스의 static

  • 같은 클래스인 객체들은 하나의 static 변수를 공유
class A
{
// ...다른 변수 및 메서드

// Data segment에 저장
// 클래스 사이즈에 포함되지 않음
static int d = 0; 

A a, b;
// d = 1
cout << ++a.d <<endl;

// d = 2
cout << ++b.d <<endl;

마땅히 넣을 곳 없는 문제

#include <iostream>
using namespace std;
 
class Test
{
public:
      Test() { cout << "Hello from Test() "; }
} a;
 
int main()
{
    cout << "Main Started ";
    return 0;
}

// 결과는?
// Hello from Test() Main Started 
// 전역 변수 a가 선언되어 있으므로
// 생성자가 main 함수보다 먼저 호출

출처

Categories: ,

Updated: