次のコード スニペットは (正しく) C で警告を出し、C++ でエラーを出します (それぞれ gcc と g++ を使用し、バージョン 3.4.5 と 4.2.1 でテストされています; MSVC は気にしないようです):
char **a;
const char** b = a;
私はこれを理解し、受け入れることができます。この問題に対する C++ の解決策は、b を const char * const * に変更することです。これにより、ポインターの再割り当てが禁止され、const-correctness ( C++ FAQ
)
を回避できなくなります。
char **a;
const char* const* b = a;
ただし、純粋な C では、(const char * const * を使用して) 修正されたバージョンでも警告が表示され、その理由がわかりません。キャストを使わずにこれを回避する方法はありますか?
明確にするために:
1)なぜこれはCで警告を生成するのですか?これは完全に const セーフである必要があり、C++ コンパイラはそれをそのように認識しているようです。
2) この char** をパラメーターとして受け入れ、それが指す文字を変更しないと言いながら (そしてコンパイラーに強制させる) 正しい方法は何ですか? たとえば、関数を書きたい場合:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
そして、char** でそれを呼び出したかったのですが、パラメーターの正しい型は何でしょうか?