2016-06-24 22 views
0

Wenn eine Variable als deklariert:Warnung: Argument übergeben x von 'xyz' von inkompatiblen Zeigertyp

char ** argv; 

und eine Definition der Funktion ist so etwas wie:

extern int my_system(const char *argv[]); 

Wenn wir nun vorbei sind das Argument in der Funktion als:

(my_system(argv)) 

dann wirft es die Warnung Gabe des Arguments 1 von 'my_system' von inc kompatibler Zeigertyp

Was kann die mögliche Lösung sein?

+1

Bitte senden Sie das [Minimal, vollständig und prüfbare Beispiel] (http://stackoverflow.com/ help/mcve) was zeigt was du probiert hast. –

Antwort

0

In C gibt es keine implizite Konvertierung zwischen T** zu const T**, da dies nicht die Modifikation des ultimativen Elements in allen Fällen verhindern würde. Siehe C FAQ's Frage 11.10 für erweiterte Erklärung und Beispiel von "Hintertür" -Modifikation.

In Ihrem Fall habe Verständnis für Feinheiten, können Sie den Zeiger auf stumm die Warnung werfen könnte:

extern int my_system(const char *argv[]); 

int main(int argc, char* argv[]) 
{ 
    my_system((const char**)argv); 
} 
+0

Wird nur in der umgekehrten Situation eine Warnung ausgegeben, wenn ein 'const' Argument an ein non 'const' übergeben wird? Es gibt niemals ein Problem mit 'strcpy' usw., das ein nicht 'const'-Argument übergeben wird. –

+0

@Weather Vane: Die angegebene Warnung bezieht sich auf 'char ** -> const char **'. Die umgekehrte Situation (die Übergabe von 'const char **' an die Funktion, die den Parameter 'char **' erwartet) ist wegen inkompatibler Zeiger nicht erlaubt, aber es ist eine andere Geschichte. –

+1

Sie erhalten eine Warnung in beide Richtungen, wenn Sie zwei Ebenen der Indirektion haben ('char **'). Sie erhalten nur dann eine Warnung mit einer einzigen Indirection ('char *'), wenn Sie const einem non-const zuweisen. Daher geht es nicht-konstant zu "strcpy()" et al. wird keine Warnung verursachen. –