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에 넣어진다.

 

 

+ Recent posts