次のコードは、(正しく)(バージョン3.4.5および4.2.1でテストGCC & G ++それぞれを用いて、MSVCは気にしていないよう)Cで警告およびC++でエラーを与える:Cで 'char **'を 'const char * const *'に変換できないのはなぜですか?
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で警告が生成されるのですか?これは完全に安全でなければならず、C++コンパイラはそれをそのように認識しているようです。
2)この文字を指している文字を変更しないと言っている間に、このchar **をパラメータとして受け入れる正しい方法は何でしょうか? たとえば、私は機能書きたい場合:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
をそして私は、文字**上でそれを呼び出すためにどのようなパラメータの正しい型になりたかったですか?
編集: 特に質問に対処したり、回答に応じた人に感謝します。
私は、できるかどうかにかかわらず、キャストなしではできないという答えを受け入れました。
私はあなたの質問については混乱しています。「Cさんに警告しないようにするにはどうすればいいですか?それとも「C++にコンパイルエラーを投げないようにするには?あるいは、どちらもそうではないかもしれません。 – user7116
私はsixlettervariablesに同意しますが、この質問はさらに明確にする必要があります。 –
質問は "なぜ私は 'char **'を 'char * const *'に変換できないのですか? – Kevin