3 분 소요

#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"}

카테고리:

업데이트:

댓글남기기