Meine Hauptaufgabe ist folgende:
int main(int argc, char const *argv[])
{
huffenc(argv[1]);
return 0;
}
Der Compiler gibt die Warnung zurück:
huffenc.c:76: warning: passing argument 1 of ‘huffenc’ discards qualifiers from pointer target type
Als Referenz, huffenc
nimmt ein char*
Eingabe, und die Funktion wird ausgeführt, mit der Beispieleingabe “Sinnlosigkeit” via ./huffenc senselessness
Was könnte diese Warnung bedeuten?
Es bedeutet, dass Sie a passieren const
Argument für eine Funktion, die ein Nicht-const
Argument, das aus offensichtlichen Gründen potenziell schlecht ist.
huffenc
braucht wahrscheinlich kein Nicht-const
Argument, also sollte es ein dauern const char*
. Allerdings ist Ihre Definition von main
ist nicht genormt.
Der C99-Standard Abschnitt 5.1.2.2.1 (Programmstart) besagt:
Die beim Programmstart aufgerufene Funktion heißt main. Die Implementierung deklariert keinen Prototyp für diese Funktion. Es muss mit dem Rückgabetyp int und ohne Parameter definiert werden:
int main(void) { /* ... */ }
oder mit zwei Parametern (hier als argc und argv bezeichnet, obwohl beliebige Namen verwendet werden können, da sie lokal für die Funktion sind, in der sie deklariert sind):
int main(int argc, char *argv[]) { /* ... */ }
oder Äquivalent;9) oder auf eine andere implementierungsdefinierte Weise.
Und sagt weiter…
… Die Parameter argc und argv und die Strings, auf die das argv-Array zeigt soll durch das Programm veränderbar seinund behalten ihre zuletzt gespeicherten Werte zwischen Programmstart und Programmende bei.
Du sagst das
huffenc
nimmt einchar *
aber du übergibst es achar const *
…– Oliver Charlesworth
13. März 2013 um 23:37 Uhr
Definiere einfach main ohne die
const
.– teppisch
13. März 2013 um 23:38 Uhr
Nun, Sie könnten, aber das ist unelegant (und potenziell gefährlich). Eine bessere Lösung ist, herauszufinden warum
huffenc
benötigt einen nicht konstanten Zeiger, und ändern Sie ihn nach Möglichkeit in const.– Oliver Charlesworth
13. März 2013 um 23:39 Uhr
Das ist eine falsche Definition von
main
wie auch immer, machen Sie es einfach richtig, damit zu beginnen;int main(int argc, char *argv[])
.– Ed S.
13. März 2013 um 23:39 Uhr
@Kay: Nun, der Standard ist ziemlich klar, dass die Definition von main entweder ist
int main(int argc, char *argv[])
oderint main(void)
. Das heißt es weiter “5.1.2.2.1 Programmstart: Die Parameter argc und argv und die Strings, auf die das argv-Array zeigt soll durch das Programm veränderbar sein…” Also, ich möchten nenne es falsch. Es wird natürlich funktionieren, aber warum? Wann hat eine der beiden Standarddefinitionen zu fehlerhaften Programmen geführt?– Ed S.
13. März 2013 um 23:45 Uhr