6

constパラメータを関数に渡そうとしていますが、受信側の関数がそのパラメータを考慮する必要があることを示しています。

次のコード例は、constとして宣言されていない変数を使用してtest関数を呼び出すことができるようにする唯一の方法を示していることを理解しました。argv

void test(const char * const *arr);

int main(int argc, char *argv[], char *env[])
{
    test(argv);
}

void test(const char * const *arr)
{
}

ただし、gccは次のような警告を表示します。

E:\Projects\test>gcc -o test test.c
test.c: In function 'main':
test.c:5:2: warning: passing argument 1 of 'test' from incompatible pointer type
[enabled by default]
test.c:1:6: note: expected 'const char * const*' but argument is of type 'char **'

これは私がここでしていることがどういうわけか間違っていると私に信じさせます。constパラメータを関数に渡し、受信側の関数がそれを考慮する必要があることを示すためのより良い方法はありますか?

4

2 に答える 2

12

C FAQは、ポインタを非constに変換するときにCにセーフガードがある理由を説明していconstます。二重にconst修飾されたターゲットポインタの場合、そこで説明されている問題は発生しないと思います。したがって、C ++には、要求している暗黙の変換を許可する緩和されたルールがあります。残念ながら、Cの場合、標準化委員会はC ++のルールが複雑すぎると判断したため、期待される型にポインターをキャストする必要があります。

于 2012-10-20T20:47:34.270 に答える
1

次のようにキャストできます。

void test(const char * const *arr);

int main(int argc, char *argv[], char *env[])
{
   test((const char * const *)argv);
}

void test(const char * const *arr)
{
}

これにより、警告が消えます。argvこれは、関数内で実際にとして扱うことができれば問題ありませんconst char * const *

于 2012-10-20T20:41:33.983 に答える