0

これが警告を表示する理由:

#include<stdio.h>
foo (const char **p)
{ 

}

int main(int argc , char **argv)
{
    foo(argv);
}

しかし、以下は警告を表示しません

char * cp;
const char *ccp;
ccp = cp;

最初のコード スニペットはfoo、互換性のないポインター型から arg 1 を渡す警告を示しています。しかし、2 番目のスニペットには警告が表示されません。どちらもconstポインタです

4

3 に答える 3

1

C FAQ リストを見る

警告を削除するためにキャストできます。

foo((const char **)argv);

しかし、FAQ が言うように: そのようなキャストの必要性は、キャストが実際に修正しないより深い問題を示している可能性があります。

于 2013-05-14T12:19:53.013 に答える
0

最初のバージョンでは、単純にポインタに a を追加するのではなく、2 つの異なるタイプのポインタ間でキャストconstしています。

  • char **へのポインタです(へのポインタchar
  • const char **へのポインタです(へのポインタconst char

ご覧のとおり、これらのポインターは、より明らかに疑わしいものに似たさまざまなタイプを指しています。

int *i;
double *d;
d = i;

2番目の例では、ポインターから const ポインターにキャストできることがわかります。これを状況に適用する場合は、const ポインター (へのポインターchar) が必要になります。

foo(char * const *p);
于 2013-05-14T12:15:53.430 に答える
0

コンパイル フラグによっては、cp のコンテンツを ccp に割り当てるときに明示的なキャストが必要になる場合があります。

于 2013-05-14T12:06:03.320 に答える