본문 바로가기

컴맹 탈출기

const 위치에 따른 해석 (Feat. Vulkan API의 복잡한 type!)

변수와 상수의 구분

변수 : 선언 이후 값을 계속 바꿀 수 있는 저장 공간

상수 : 선언할 때 값을 할당 후, 값을 바꿀 수 없는 저장 공간 (const keyword로 표현)

리터럴 : 값 자체 

 

 

const 위치에 따른 해석

const char* : 상수형 char에 대한 ptr. ptr이 가리키는 변수의 값을 바꿀 수 없다.

char const * : char에 대한 상수형 ptr. ptr이 다른 char를 가리킬 수 없다.

const char const * : 상수형 char에 대한 상수형 ptr. ptr이 다른 char를 가리킬 수 없고, 변수의 값도 바꿀 수 없다.

 

 

응용

다음 코드는 vulkan api의 VkInstanceCreateInfo 구조체와 구조체 초기화의 일부이다.

 

 

 

ppEnabledExtensionNames는 const char* const* 형 변수이다. (line 10)

glfwExtensions는 const char **형 변수이다.

 

glfwExtensions는 char에 대한 이중 포인터인데 이걸 상수화하였으므로

char value가 상수화된다.

 

ppEnabledExtensionNames에는 glfwExtensions의 값이 대입되기 때문에

char에 대한 이중 포인터가 된다. 

이 이중 포인터가 가리키는 char value가 상수화되어 있으므로 const char,

이 이중 포인터를 상수화하기 위해 const*가 붙었다.

 

glfwExtensions와 ppEnabledExtensionNames 둘다 char** 인 상황에서,

glfwExtensions는 가장 하단의 char value가 상수라고 표현하는 것이고,

ppEnabledExtensionsNames는 char value가 상수는 동의하는데

자신이 가리키는(이중 포인터) 것도 바꾸지 않겠다는 것이다.