extern, static, const, volatile 간단 정리
extern
다른 c파일에서 변수, 함수를 공유하기 위해서 사용한다.
예를 들면 aaa.c에서 int a =1; 를 선언했다고 하자.
bbb.c에서 a를 참조하려면 extern int a; 로 a 변수를 참조할 수 있다.
static
extern과 달리 다른 c파일에서 참조하는 것을 막기위해 사용한다.
한 파일 내에서는 전역변수로 사용한다.
aaa.c에서 static int a = 1;로 선언하면 bbb.c에서 aaa.c가 선언한 a를 참조할 수 없다.
그냥 지역변수는 선언된 블록 내에서 사용 가능하다.
const
이미 assign 된 값을 변경할 수 없게 해준다.
예외도 있다.
const int i = 0;
*(int*)(&i) = 1; 은 가능하다.
여기서 #define a = 1; vs const a = 1; 의 차이점은
const는 메모리가 할당됨으로써 디버깅 시에 메모리 값을 확인할 수 있다,
volatile
const와 반대로 변수가 언제 어떻게 바뀔지 모른다고 알려주기위해 사용한다.
컴파일러는 volatile 변수는 최적화에서 제외하여 항상 메모리에 접근하도록 한다.
예를 들어
int main()
{
int i=0;
while (i < 10)
i++;
}
위의 코드를 아래와 같이 최적화 시킨다.
int main()
{
int i = 10;
}
하지만 volatile을 사용하면
int main()
{
volatile int i=0;
while (i < 10)
i++;
}
그냥 코드 그대로 컴파일한다.
extern const volatile int a;
const, volatile은 반대 개념인대 위와 같이 사용했다면
a가 하드웨어에 의해 변경될 수 있지만 (volatile), 프로그램 내부에서는 값이 변경될 수 없음을 뜻한다. (const)
https://dojang.io/mod/page/view.php?id=749
C 언어 코딩 도장: 85.15 volatile 변수
변수를 선언할 때 앞에 volatile을 붙이면 컴파일러는 해당 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 만듭니다. volatile 자료형 변수이름; volatile int num1 = 10; // 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 만듦 volatile로 선언한 변수는 사용할 때 항상 메모리에 접근합니다. 즉, 이 변수는 언제든지 값이 바뀔 수 있으니까 항상 메모리에 접근하라고 컴파일러에게 알려주는 것입니다. 예를 들어 다음과
dojang.io
https://littlepenguin.tistory.com/7
C 언어 키워드 정리 (const / register / static / volatile / inline)
리눅스 커널 코드를 보면서 자주 만나던 키워드들과 기타 키워드들을 정리해봤다. const declaration할 때 assign된 값을 변경할 수 없게 해주는 키워드다. const int a = 10; a = 11; 따위를 할 수 없다. *(&a) =..
littlepenguin.tistory.com
register
많이 사용하는 변수를 register 에 넣고 사용한다.
최적화 옵션을 켜면 자동으로 자주 사용하는 변수는 register에 넣어진다.