-
[C] 까다로운 keyword 들 (extern, static, const, register, volatile ...)최신과학기술 2011. 12. 21. 13:14프로그램의 규모가 커지면서..
좀더 효과적인 동작을 위해 redundancy 를 최소화하려하고,
쓸데없이 상주하는 쓰레기들을 메모리에서 적절히 제거하고...
뭐 이런 고민들은 프로그래머들이 항상 고민하는 바입니다.
C 초보인 저같은 경우에는 이런 고민을 할 때마다 항상 발목을 잡는게
기초적인 내용을 명확히 내것으로 소화하지 못해서인 경우가 대부분인데.
이번에 정리한 내용은 external linkage 를 위해서
global variable 을 선언하고 사용할 때 쓸 수 있는 keyword 들에 대한 구분과 정리 입니다.
* extern 은 변수의 declaration 이고, 메모리 할당없이 해당 변수의 type을 컴파일러에게 알려주는 역할을 할 뿐이다. 해당변수는 전체 프로그램내에서 오직 1번만 definition 이 존재하면 된다.
* static 은 global variable 로 정의된 변수중 다른 compilation cope 에서 사용하지 못하게 그냥 두는것, extern으로 접근 할 수 없게 되는 거죠.
* static 을 특정 local 변수에 붙이면 변수 scope 은 local 이지만 object 파일의 shared 영역에 (.bss) 에 정의 되므로 소멸되지 않느다. 함수에 정의 된경우도 stack 에 정의되는것이 아니기 때문에 함수에 재진입시 변수가 마지막으로 assign 된 값을 확인할 수 있다.
* const 는 최초 정의된 값에 대한 재 assign을 막으라는것. 함수 parameter로 사용시 해당 함수내에서 수정이 불가하다. tip으로 pointer 를 이용해서 수정은 가능하기도 한댄다. (*(int*)&my_age = 35;)
* register 는 compiler 에게 '자주 사용되니 register에 놓고 쓰는게 효율적일 꺼다' 라고 알려주는 것이다.
* volatile 은 변수가 보통 procedure 이외에 변경될 수 있는 경우(예. interrupt context)가 있는 변수에 보통 붙여서 reload 시 processor 의 register 나 cache 가 아닌 memory 에서 값을 가져오라고 compiler 에게 알려주는 것이다.(단어 뜻 자체가 '비휘발성의') 니까요.
그렇다면 다음과 같은 고민이 생길 수 있습니다.
- 'static const' 를 global variable 에 붙이면 현재 compilation scope에서만 사용할 수 있으며 초기값이 정의되면 변경 불가능한 상수처럼만 사용된다.... 이럴 바에는 해당 변수를 그냥 define문을 이용하면서 메모리를 줄이는게 낫지 않을까요?
* 'definition' 과 'declaration' 의 차이를 이해하라
* header 에는 global variable 을 정의하지 않고, extern으로만 정의하...는게 좋다.
이외의 C 의 keyword 들을 아래에서 모두 잘 정리되어 있네요.
http://tigcc.ticalc.org/doc/keywords.html#volatile
위의 정리는 ansi C 표준에 대한것이며
asm, inline 은 GNU C 표준이다....