V1.8 z/OS XL C コンパイラーを使用し、INFO(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 への const ポインターに int ポインターを割り当てることができる場合 (3 行目)、int ポインターのアドレスを const ポインターに const int へのポインターに割り当てることができないのはなぜですか? 私は何が欠けていますか?
上記のコードは、少量のコードで発生している問題を示しているだけのスリム化された例であることに注意してください。実際のコンテキストは、構造体 (struct s** const) へのポインターへの const ポインターがあり、それを関数への引数として渡していることです。関数のパラメーターは、const struct (const struct s** へのポインターへの const ポインターとして定義されています)定数)。これは、関数が構造体のデータを変更せず (したがって最初の const)、渡されたアドレスを常に保持するポインター パラメーター (したがって 2 番目の const) を変更しないためです。指しているポインターの値は、途中で変更される場合があります (これが、** の間に 3 番目の const がない理由です)。