본문 바로가기
언어 정리/C++_개념_lib

정적변수, 전역변수

by 알 수 없는 사용자 2024. 1. 16.

정적변수 - 메모리값이 유지되나( 전역변수처럼 ), 지역변수로서 해당 블록에서만 사용이 가능

void doSomething()
{
	static int a = 1;
	++a;
	cout << a << endl;
}
int main()
{
	doSomething(); // 2 출력,첫 호출! 이 때 a의 초기화가 1로 처음이자 마지막으로 이루어진다. 
	doSomething(); // 3 출력
	doSomething(); // 4 출력
	doSomething(); // 5 출력
}

 


전역변수, 

전역 변수의 종류
    - static 붙은 전역변수 → 이 cpp 파일 내에서만 사용 가능
    - extern 붙은 전역변수 → 다른 파일에서도 사용이 가능함과 동시에 메모리 공유된다.
    - extern 생략 가능하다. 전역변수는 디폴트로 extern.
    - 디폴트로 전역변수, 전역함수는 다른 파일에서도 사용 가능

// aaa.h 파일에서
int a = 123; 

// main.cpp 파일에서
#include "aaa.h"
using namespace std;
extern int a; // aaa.h 의 int a 를 불러온다 라는 의미
int main()
{
	cout << a << endl; // 123 출력
}

 

namespace {}블럭안에서 extern 시 공유된다.

// MyConstants.h 파일에서
namespace Constants
{
	extern const double pi(3.141592);
	extern const double gravity(9,8);
}

// main.cpp 파일에서
#include "MyConstants.h"

int main()
{
    cout << Constants::pi << endl;
}

 

h 파일에서의 전역변수 정리

/* 초기화 X */
int g_x;  // external. 다른 파일에서 사본으로 쓰인다. 
static int g_x; // internal. 다른 파일에서 쓰일 수 없다. 이 코드 내에서만 쓰일 수 있음
const int g_x; // external. 에러! const는 꼭 초기화를 해주어야함
extern int g_z; // 이 파일을 include 하는 다른 파일에서 이 변수와 메모리를 공유하게 될 것.
extern const int g_z; // 에러 아님! 이 변수와 메모리를  공유하는 다른 파일에서 초기화 꼭 해주면 됨.

/* 초기화 O */
int g_y(1); // external. 
static int g_y(1); // internal. 
const int g_y(1); // external. 
extern int g_w(1); // 이제 다른 파일에서 정의가 불가능하다. 
extern const int g_w(1); // 에러

 

 

'언어 정리 > C++_개념_lib' 카테고리의 다른 글

for-each  (0) 2024.01.16
enum, 구조체  (0) 2024.01.16
this, function return 자료형  (0) 2024.01.16
char , 배열과 포인터 차이  (1) 2024.01.04
스마트 포인터, casting  (1) 2024.01.03

댓글