C: Compiler-Warnung "return discards qualifiers from pointer target type"
Bekomme ich einen compiler - "Warnung: return discards qualifiers from pointer target type" aus meiner Funktion unten.
unsigned char* getBeginning(const unsigned char * Packet)
{
return Packet+3;
}
Habe ich recherchiert das auf SO und an anderen Orten, und es scheint, dass der compiler beschwert sich, dass obwohl ich in einem const-Zeiger, bin ich wieder einen non-const-Zeiger.
Was ich versuche zu erreichen ist:
1.) ich möchte damit die Benutzer wissen, dass ich es nicht ändern Sie Ihre Daten in dieser Funktion, daher der const.
2) Jedoch später Funktionen verwenden Sie den Mauszeiger hier wieder zu änderungen, so dass ich nicht möchte, dass meine Rückgabetyp const als gut.
Gibt es einen besseren Weg, dies zu tun, wo ich nicht eine Verwarnung bekommen? Ich bin immer noch lernen, C.
- Sind Sie sicher, dass Sie müssen entfernen die
const
? Das klingt wie eine schlechte Idee... - Das ist eine gemeinsame C-idiom für diesen Fall (die alternative wäre, schreiben Sie zwei Funktionen (eine für
const
, einen für nicht-const
), oder schreiben Sie nur eine nicht-const
version und lassen Sie die Anrufer Besetzung derconst
entfernt), cf.strchr
. - Danke für die Antwort! Nach dem Lesen der Antworten ist es möglich, ich mache das komplett falsch. Ich wollte für die user, pass mir ein unsigned char *. Es muss nicht ein const unsigned char *. Ich dachte, ich könnte mit dem "const" in der definition einer Funktion zu zeigen, dass ich wäre nicht das ändern der Daten wies IN DIESE BESONDERE Funktion. Also, in anderen Worten, ich bin mir nicht erwarten, dass die user, pass mir ein const unsigned char *, ich wollte nur, um Ihnen zu zeigen, ich werde nicht zu berühren, unsigned char * hier. Später, ist der zurückgegebene Zeiger ist das ändern von Daten. Gibt es einen besseren Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
C nicht über eine implizite Konvertierung von const-qualifizierten Zeiger-Typen zu nicht-const-qualifiziert sind, so sollten Sie hinzufügen eine explizite, d.h. eine Besetzung. Dann ist die Warnung Weg gehen:
Nur Hüte dich, daß diese Funktion ist dann gelinde gesagt "gefährlich", da Sie es verstecken können, der Abwurf von const-qualification. Aber es ist nicht gefährlicher als Dinge wie
strchr
in der standard-Bibliothek, die das gleiche tun. Das Verhalten ist ganz genau definiert, wie lange, wie Sie jeden Versuch unterlassen, zu ändern, einen const-qualifiziert-Objekt über den zurückgegebenen Zeiger.strchr
Ergebnisse zu undefiniertem Verhalten, richtig?const char
, dann zu modifizieren, es wäre riskant... einfach nicht erwarten, dass die übergabe eines string-literal-Konstante, es gibt einen neuen Zeiger auf eine veränderbare array von char (kein malloc + memcpy passiert), aber wenn Sie an einem regelmäßigenchar*
zu es, die Speicher-Orte bleiben die gleichen, wenn es deutete auf einechar[99]
es ist sicher zu ändern, diese 99 bytesPacket
erklärt wirdconst unsigned char *
. Ohne einen expliziten cast beim hinzufügen 3 Sie sind implizit deklarieren das Ergebnis ist vom gleichen Typ.Den Fehler zu beheben, müssen Sie explizit die Besetzung der return-Typ: