정적변수 - 메모리값이 유지되나( 전역변수처럼 ), 지역변수로서 해당 블록에서만 사용이 가능
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 |
댓글