본문 바로가기
  • 여행하고 먹는 즐거운 콘지의하루
프로그래머의 프로그래밍 이야기/C++ Programming

C/C++ const/constexpr 키워드 사용법, 차이

by 콘지 2022. 6. 14.

안녕하세요  최근 misra C 코딩 룰셋을 따르다 보니

변경되지 않는 변수나, 초기화 후 변경 되지 않는 값임에도 변수로 설정되어 있는 경우

그 값을 상수로 설정하라는 경고가 나와서 const/constexpr 키워드에 대해 자세히 살펴보게 되었습니다.

 

목차 

1. 상수란 ?

2. const / constexpr 이란 ? 

 

 

1. 상수란 ?

먼저 상수에 대해서 간단히 정의해 보자면

변하지 않는 값, 프로그래밍에서 사용하는 변수와는 다르게 한번 정의하면 값을 바꿀수 없는 특징을 지님
int a = 10; 
a = 20;

코드 처럼 a 의 값을 변경하는 것은 변수라고 부르지만

파이(PI)와 같은 3.141592... 값은 불변의 값이기 때문에 변경할 수 없으므로 그것은 상수라고 부릅니다.

상수는 const 라는 키워드를 붙여서 사용합니다.

const int a = 10; 
a = 20; /* error ! */

코드 처럼 const 키워드를 붙인 상수값의 변경은 오류를 발생 시킵니다.

 

2. const / constexpr 이란 ? 

const 와 constexpr 전부 상수를 만드는 키워드지만 약간의 차이가 존재합니다.

우선 const/constexpr은 전부 정의와 선언을 같이 해주어야 합니다.

const int a; /* error */
const int b = 10;
constexpr int c; /* error */ 
constexpr int d = 10;

그렇다면 차이점은요

 

const는 상수지만, 그 값이 컴파일 타임에 정해질 필요가 없습니다.

constexp는 상수지만, 그 값이 컴파일 타임에 확정되어야 합니다. 

 

즉, 우리가 gcc/g++ 혹은 그 외의 컴파일러를 통해 프로그램을 만드는 행위를 컴파일이라고 한다면

const 로 선언한 상수는 컴파일 시점에 그 값이 명확하냐 하지 않냐로 const/constexpr의 사용법 차이가 존재한다는 것입니다. 

void func(int n){
	constexpr int a = 10; 
	constexpr int b = 10 + n;  /* error */ 
	constexpr int c = a + 10 ; 

	const int ca = 10; 
	const int cb = ca + 10; 
	const int cc = n + 10; 
	const int cd;  /* error */
}

코드를 보면서 간략하게 설명해보자면, 

func 함수에서 파라미터로 전달되는 n의 경우는 사실 컴파일 시점에 정해지지 않은 값입니다.

사용자의 입력에 따라 다를수 있기 때문입니다. 

const 키워드로 정의한 cc 의 경우 그 값이 컴파일 타임에 정해질 필요가 없기 때문에 오류가 발생하지 않습니다.

하지만, constexpr 로 정의한 b의 경우 그 값이 컴파일 타임에 정해져야 하기 때문에 오류가 발생합니다.

 

 

 

반응형

댓글