안녕하세요 최근 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의 경우 그 값이 컴파일 타임에 정해져야 하기 때문에 오류가 발생합니다.
'프로그래머의 프로그래밍 이야기 > C++ Programming' 카테고리의 다른 글
C++ 오버로딩 다양한 사용법 정리 (1) | 2022.06.20 |
---|---|
C/C++ const 키워드 위치 (0) | 2022.06.15 |
C++ noreturn 이란 (0) | 2022.02.07 |
댓글