티스토리 뷰

C\\C++

[C/C++] static 과 extern

아몬드통 2022. 12. 25. 11:51

static 의 특성

  • - 전역, 지역 관계없이 static 키워드가 붙은 변수는 프로그램 시작과 동시에 할당 및 초기화. 
  • - 단 한번 할당 및 초기화되고 프로그램 종료시까지 메모리 공간에 존재

변수

전역 static 변수

  • - 외부 파일에서 접근을 허용하지 않는다. 즉 "이 변수의 접근범위는 파일 내부로 제한한다" 이다.
  • - 다른 파일에서 extern int num; 으로 참조를 하면 컴파일시 에러 발생.
//main.cpp
static int age = 14;
int year = 2023;

int main(int argc, char* argv[])
//func.cpp
extern int age;	//error
extern int year;//ok

int func(){
	age++;
	year++;
}

지역 static 변수

  • - 선언된 함수 내에서만 접근 가능(지역변수적 특성)

함수

  • - c에서는 js처럼 함수 안에서 함수를 만들 수 없다. 그래서 지역함수라는 것은 없다.
  • - 모든 함수는 전역함수이므로 위의 전역변수에 설명한 내용이 그대로 적용된다.
//main.cpp
static int sum();
void show();

int main(int argc, char* argv[]){
	return 0;
}
static int sum(){ //함수의 정의는 static 생략가능. 단! 선언에 static이 없으면 정의에도 없어야함.
	//증가연산
}
void show(){ 
	//출력
}
//func.cpp
extern int sum();	//error
extern void show();	//ok

int func(){
	sum();
	show();
}

추가 의문점

  • - main.cpp에 static int gNum = 0; 을 선언하고 sum() 함수에서 gNum++; 을 시키면 어떻게 될까?
  • - 답은 아무 문제 없이 잘 실행된다. extern은 아마도 해당 파일로 찾아가 내부에서 함수를 실행시킨다고 보면 될것 같다.

 

 

한번도 써본적없는 register 키워드

  • - c와c++에서 사용되어지는 키워드로 컴파일러에게 CPU의 레지스터 공간에 메모리를 적재하라는 키워드다.
  • - 다만 register int num = 3; 이렇게 선언을 한다고 하더라도 실제로 레지스터에 할당이 되는 것은 컴파일러의 판단이다.
  • - register로 선언하지 않아도 컴파일러가 판단하면 register에 적재 될수도 있다.
  • - 지역변수로만 가능하고 전역변수는 불가능하다!(레지스터 메모리는 매주 작은 메모리라서 비용이 아주 비싸다)

 

클래스에서의 static 변수는 다음 포스팅으로 해보자.

댓글