, 나는 아래의 코드 라인 4에 다음과 같은 경고를 얻을 :"const int ** const"와 "int **"유형 사이의 초기화가 허용되지 않습니다. 이유가 무엇입니까? 뇌파 업 정보 (ALL)를 사용하여 경고와 함께 V1.8의 z/OS의 XL C 컴파일러를 사용하여
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 포인터를 할당 할 수 있다면 const 포인터에 대한 int 포인터의 주소를 const int에 대한 포인터에 할당 할 수없는 이유는 무엇입니까? 내가 뭘 놓치고 있니?
위의 코드는 소량의 코드에서 발생하는 문제를 보여주는 간단한 예제입니다. 실제 문맥은 struct (struct s ** const)에 대한 포인터에 대한 const 포인터를 가지고 있으며이 포인터를 const 포인터 (const struct s **)에 대한 const 포인터로 정의 된 함수의 인수로 전달하는 것입니다. const). 이것은 함수가 구조체 (따라서 첫 번째 const)의 데이터를 수정하지 않고 전달 된 주소 (즉 두 번째 const)를 항상 보유하는 포인터 매개 변수를 수정하지 않기 때문입니다. 가리키는 포인터의 값은 그 방법으로 변경 될 수 있습니다 (따라서 ** 사이에 세 번째 const가 없음).
파벨 (Pavel)과 찰스 (Charles)는 컴파일러가 경고하는 이유를 완벽하게 분명히했습니다. 나는 둘 다 upvoted지만 C의 관점에서 (두 답변은 매우 유사하고 왜 경고가 발급되었는지 보여 주지만) 그것을 부셔 찰스에게 크레딧을 줬다. –