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 함수보다 먼저 호출