문제

v1.8 Z/OS XL C 컴파일러를 사용하여 정보 (ALL)를 사용하여 경고가 촉발 된 경고와 함께 아래 코드의 4 행에 다음 경고를받습니다.

WARNING CCN3196 Initialization between types "const int** const" and "int**" 
                is not allowed.


1  int foo = 0;
2  int *ptr = &foo;

3  const int * const fixed_readonly_ptr = ptr;

4  const int ** const fixed_ptr_to_readonly_ptr = &ptr;

왜이 경고를받는 이유를 둘러 볼 수 없습니다. const int (줄 3)에 대한 const 포인터에 int 포인터를 할당 할 수 있다면, int 포인터의 주소를 const 포인터에 const int에 대한 포인터에 할당 할 수없는 이유는 무엇입니까? 내가 무엇을 놓치고 있습니까?

참고 위의 코드는 소량의 코드로 발생하는 문제를 보여주는 단지 예제입니다. 실제 컨텍스트는 내가 구조물 (struct s ** const)에 대한 포인터에 대한 const 포인터를 가지고 있고 그것을 const struct (const struct s **)에 대한 const 포인터로 정의 된 함수로 인수로 그것을 전달한다는 것입니다. Const). 이는 기능이 구조물에서 데이터를 수정하지 않기 때문에 (따라서 첫 번째 const), 항상 전달 된 주소를 보유하는 포인터 매개 변수 (따라서 두 번째 const)를 수정하지 않기 때문입니다. 포인터의 값은 그건 그렇기 때문에 변경 될 수 있습니다 (** ** 사이에 세 번째 const가없는 이유).

도움이 되었습니까?

해결책

C 규칙은 포인터를 Const Something에 대한 포인터로 무언가로 변환 할 수 있지만, Const 및 휘발성 자격을 포함하여 체인 아래에있는 것과 정확히 동일한 유형이어야한다는 것입니다.

이 규칙의 이론적 근거는이 두 줄의 두 번째 라인이 허용된다면 다음과 같습니다.

int *ptr;

const int ** const fixed_ptr_to_readonly_ptr = &ptr;

그런 다음 캐스트없이 타입 안전을 파괴하는 데 사용할 수 있습니다.

const int i = 4;

// OK, both sides have type const int *
*fixed_ptr_to_readonly_ptr = &i;

// the value of fixed_ptr_to_readonly_ptr is still &ptr
// the value of ptr is now &i;

*ptr = 5;

// oops, attempt to change the value of i which is const

다른 팁

유형 안전 위반입니다. 이 코드를 고려하십시오 (나는 섞었다 const 포인터 또는 포인트에 적용되는지 여부를 명확히하기 위해 약간의 약물이지만 의미 적으로는 똑같은 것을 의미합니다) :

int* p = 0;
int const** pp = &p; // presumably ok

int const c = 123;
*pp = &c; // okay, &c is int const*, and *p is int const* lvalue

*p = 666; // okay, *p is int lvalue

// wait, so we just changed the value of (const) c above, with no const_cast!

이것은 유형 안전 위반입니다. 대신 const int * const *를 사용하고 싶을 것입니다. 보다 http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top