extern 키워드
// [ExternTest.h]
extern int globalValue;
void IncreaseValue();
// [ExternTest.c]
int globalValue;
void IncreaseValue()
{
globalValue++;
}
// [main.c]
#include "ExternTest.h"
// 컴파일러에 의해 다음과 같이 치환
// extern int globalValue;
// void IncreaseValue();
void main()
{
printf("$d", globalValue);
}
static은 외부 파일에서 접근 불가능 하다
- 범위의 제한을 받는 전역 변수, only 전역 변수랑은 좀 다르다.
- 범위
- static은 외부 파일에서 접근 불가능 하다
[ExternTest.h]
extern int globalValue;
void IncreaseValue();
[ExternTest.c]
// static 변수다, 다른 파일에서 접근 불가능 하다. extern이 있다고 하더라도
static int globalValue; void IncreaseValue()
{
globalValue++;
}
[main.c]
#include "ExternTest.h"
// 컴파일러에 의해 다음과 같이 치환
// extern int globalValue;
// void IncreaseValue();
void main()
{
// 링커 에러가 발생한다. "링킹" 과정중(컴파일 에러가 아니라...)에서 globalValue의 주소를 가져오지 못한다.
printf("$d", globalValue);
}
함수 내부의 정적 변수
void Accumulate(int number)
{
static int result = 0; <-- 한번만 초기화 됨,
result += number;
cout << result << endl;
}
클래스 내부의 멤버 변수
//[Cat.h]
class Cat
{
private:
static int mCount;
};
//[Cat.cpp]
int Cat::mCount = 0;
- 정적 멤버 변수는 클래당 하나의 COPY만 존재
- 클래스 메모리 레이아웃에 존재
- exe 파일 안에 필요한 메모리가 이미 잡혀 있음
정적 멤버 함수
- 개체 없이 호출 가능
- 정적 멤버에만 접근 가능.
- 주로 수학 계산식 함수가 많은 클래스가 정적 멤버 함수 사용하기에 괜찮음, 계산하려고 개체 만드는 것은 이상하니까.
베스트 프랙티스
- 함수 안에 정적 변수를 사용하지 말 것
- 클래스 안에 넣을 것
- 클래스 안에 넣어야 그 클래스가 어떤 정적 변수를 사용하는지 찾기 쉬움
- 전역변수 대신 정적 멤버 변수를 쓸 것
- 범위를 제한하기 위해, 쓸떼없이 참조 안해도 될 곳에서 참조 하게끔 하는 것을 막기 위해
- C 스타일 정적 변수를 사용 할 일은 이제 없음