상수
#include <iostream>
int main() {
const int c = 10; // 컴파일 시간 상수. 매크로 처럼 동작한다.
int n = 10;
std::cin >> n;
const int d = n; // runtime 상수. 실행시간에 변경 불가능 하다는 의미.
int *p = &d; // error C2440: '초기화 중': 'const int *'에서 'int *'(으)로 변환할 수 없습니다.
// 상수의 주소를 int* 에 담기?
int *q = (int*)&d; // ok.
int* r = const_cast<int*>(&d); // c++ const_cast<> 도 가능
*q = 20;
std::cout << c << std::endl; // 10
std::cout << *q << std::endl; // 20
}
error code -C2440 ‘초기화 중’: ‘const int *‘에서 ‘int *‘(으)로 변환할 수 없습니다. —
- c89: 배열의 크기는 컴파일 시간 상수만 된다.
- c99: 배열의 크기는 변수도 가능하다. gcc 지원, VC++ 지원 안함. ```cpp void foo(const int s) { int x[s]; // error C2131: 식이 상수로 계산되지 않았습니다. }
int main() { int x1[3]; // ok.
int s2 = 3;
int x2[s2]; // error C2131: 식이 상수로 계산되지 않았습니다.
// gcc: ok.
const int s3 = 3;
int x3[s3]; // ok
const int s4[] = { 1,2,3 };
int x4[s4[1]]; // error C2131: 식이 상수로 계산되지 않았습니다.
// int x4[*(s4 + 1)] 결국 배열(s4) 는 포인터 이므로.
foo(3); } ``` >error code >- [C2131 식에 상수 값이 있어야 합니다.](https://docs.microsoft.com/ko-kr/cpp/error-messages/compiler-errors-1/compiler-error-c2131){:target="_blank"} --- c++11: 컴파일 상수를 위한 새로운 키워드 도입 ```cpp #include <iostream> constexpr int foo(int a, int b) { // c++14 부터는 인자 앞이어도 constexpr 가능.
return a + b; // 컴파일러는 컴파일 시간에 상수 덧셈을 할 수 있다. }
int main() { int n = 10;
const int c1 = 10; // c++98/03 스타일
const int c2 = n;
constexpr int c3 = 10; // c++11/14
constexpr int c4 = n; // error C2131: 식이 상수로 계산되지 않았습니다.
int n2 = 3;
int x[foo(3, 4)]; // 배열 크기로 함수도 사용가능하다.
// 단 함수 리턴값이 constexpr 이어야 한다. } ``` >error code >- [C2131 식에 상수 값이 있어야 합니다.](https://docs.microsoft.com/ko-kr/cpp/error-messages/compiler-errors-1/compiler-error-c2131){:target="_blank"}
댓글남기기