3

次の関数への呼び出しのコンパイル中:

char* process_array_of_strings(const char** strings);

char**aが引数として渡されると、GCC は文句を言います。

note: expected ‘const char **’ but argument is of type ‘char **’

この関数は文字 (したがって const) を変更しませんが、文字ポインター自体を変更するためにポインターの配列を複製するため、ここでは定数ポインターは明らかに望ましくありません。

コンパイルが成功し、プログラムが動作しているように見えます。では、プログラマーはこの警告をどのように処理すればよいのでしょうか?

4

2 に答える 2

7

キャストを使用して変換を明示的にすると、コンパイラーは満足します。

process_array_of_strings((const char**) foo);

このような場合、自分が何をしているのかを知っていると明示的に言う必要があります。

于 2012-11-25T19:02:52.960 に答える
4

これが、C++ でchar **が自動的に に変換されないconst char **理由であり、C コンパイラがそれを許可しているときに警告を発する理由です。

/* This function returns a pointer to a string through its output parameter: */
void get_some_string(const char ** p) {
    /* I can do this because p is const char **, so the string won't be modified. */
    *p = "unchangeable string in program core";
}

void f() {
    char * str;
    /* First, I'll call this function to obtain a pointer to a string: */
    get_some_string(&str);
    /* Now, modify the string: */
    for (char * p = str; *p; p++)
        *p = toupper(*p);
    /* We have just overwritten a constant string in program core (or crashed). */
}

何をするかについての説明から、ポインターも文字も変更しないため(ただし、ポインターを他の場所に複製するため)process_array_of_strings()、同様にうまくいく可能性があります。const char * const *その場合、上記のシナリオは不可能であり、コンパイラは理論的には警告なしで自動的に変換することを許可できますが、それは言語の定義方法ではありません。char **const char * const *

したがって、答えは明らかにキャスト(明示的)が必要だということです。警告が表示される理由を完全に理解できるように、この説明を書きました。これは、警告を黙らせることにしたときに重要です。

于 2012-11-25T19:24:32.400 に答える