// ExternTest.hexternintglobalValue;// <- extern 전역 변수!voidIncreaseValue();// ExternTest.c#include"ExternTest.h"intglobalValue=2;voidIncreaseValue(){globalValue++;}// main.c#include"ExternTest.h" // <- ExternTest.h에 적힌 내용을 여기에 복붙해준다는 식의 의미// extern 이니 어딘가에 값이 있다는 뜻이니 빌드는 해줄게!intmain(){printf("%d",globalValue);}
2. c 스타일 static
정적 변수가 함수 밖에 있다면 다른 파일에선 이 정적 변수에 접근할 수 없음
내 함수 밖에선 못쓰게 범위를 제한해준다 (외부 파일에서 내 변수 접근 못하게 막는 법이었음)
// StaticTest.hexternintglobalValue;// <- extern 키워드 사용했음!voidIncreaseValue();// StaticTest.cpp#include"StaticTest.h"staticintglobalValue=2;// <- 근데 static 을 딱 붙이면, 링커 에러가 남. // 저 변수는 static이라서 밖에서 못 쓰는 거야;;// 그래서 exe 파일 안나옴.voidIncreaseValue(){globalValue++;}// main.cpp#include"StaticTest.h"intmain(){// 링커(Linker) 에러printf("%d",globalValue);return0;}
3. 함수 속 정적 변수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
voidAccumulate(intnumber){staticintresult=0;// <- static// 보통 함수에 들어올 때 마다 지역 변수로 생성하고 버리는데,// 만드는 순간 얘는 이 함수 영역에 짱박히게 됨.// 근데 한번 이 코드가 실행되어 초기화 되면,// 다음에 또 이 함수가 호출될 땐 초기화문을 건너뛰어버림.// 그래서 result가 0 이 되는게 아님!result+=number;std::cout<<"result = "<<result<<std::endl;}intmain(){Accumulate(10);// 10Accumulate(20);// 30return0;}
함수로 범위(scope)가 제한된 전역 변수
1
2
3
4
5
6
7
8
9
10
11
12
13
voidAccumulate(intnumber){// 여기서부터staticintresult=0;result+=number;std::cout<<"result = "<<result<<std::endl;// 여기까진 result에 접근 가능}intmain(){// 다른 영역에선 result에 접근 불가}
댓글남기기