Wie beseitigen Sie die "discard qualifier" Warnung?
GCC verwenden und C99-Modus habe ich eine Funktion deklariert als:
void func(float *X);
Wenn ich die Funktion aufrufen, ich benutze einen flüchtigen array Y:
volatile float Y[2];
int main()
{
func(Y);
return 0;
}
Beim kompilieren (mit -Wall
), bekomme ich die folgende Warnung:
warning: passing argument 1 of ‘func’ discards qualifiers from pointer target type
blah.c:4: note: expected ‘float *’ but argument is of type ‘volatile float *’
Kann ich beseitigen mit einer expliziten (float *)
Art werfen, aber dies wiederholt sich an vielen stellen im code.
Gibt es eine Möglichkeit, dies zu beseitigen spezifische Warnung, mit einer option oder ein pragma (oder etwas vergleichbares)?
Was hat das mit printf?
du hast Recht, die eigentliche Funktion printf, ich habe gerade die Frage mehr allgemein.
du hast Recht, die eigentliche Funktion printf, ich habe gerade die Frage mehr allgemein.
InformationsquelleAutor ysap | 2012-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Sie können nicht drehen, dass die Warnung aus. Es sagt, du bist gegen das Typ-system. Wenn Sie möchten, rufen Sie
func
müssen Sie entweder, um es zu übergeben-Zeiger auf nicht-volatile Daten, oder ändern Sie die Funktion, die Unterschrift zu akzeptieren Zeiger auf volatile Daten.volatile
qualifier ist ein signal für den Optimierer. So Frage ich mich, warum es gilt als ein Verstoß gegen das Typ-system?!In der gleichen Weise wie die übergabe eines
const int*
eine Funktionfunc(int*)
ist ein Verstoß gegen das Typ-system.wie
const
ist Bestandteil der Art.Jonathan - wobei akzeptiert wird, dass Ihre Kommentare, ich sehe einen Unterschied zwischen der
const
und dievolatile
Qualifikation. Ich verstehe es so,const
qualifier gibt compile time (im Gegensatz zu Optimierung) Informationen über das Objekt. Zum Beispiel sollte es verhindern, dass ich aus der Zuweisung eines Wertes an das Objekt, und ich sollte bekommen eine Diagnose, wenn ich versuche, das zu tun. Mit volatile, es gibt kein solches problem (das kann ich mir vorstellen, gerade jetzt).... aber, wenn Sie kommen zu denken es, den Punkt kann sein, dass der compiler die Wachen in den Fall, wo ein flüchtiges Objekt übergeben wird, a non-volatile Funktion, und die Funktion, dass nicht-flüchtigen Argumente, ist über-optimiert zu dem Punkt, wo das Ergebnis pro das flüchtige Objekt, ist falsch!
InformationsquelleAutor Jonathan Wakely
Ermöglicht der Standard mit den Compilern zu tun, was Sie wollen, wenn eine nicht-qualifizierte Zeiger wird verwendet, um den Zugriff auf eine
volatile
-qualifizierte Objekt. Dies ermöglicht Plattformen, wo einigevolatile
-qualifizierte Objekte erfordern möglicherweise spezielle Anweisungen, um Ihnen den Zugang, wenn z.B. ein schreiben übervolatile uint16_t*
tun könnten, generieren von code-äquivalent zu:Wenn ein compiler Autor vertritt die Haltung, dass Compiler sollte nur nutzen solche Freiheiten auf obskuren Plattformen waren gerade dabei, sonst würde das teuer werden, und sollte eine vernünftige Verhaltensweisen auf Plattformen, wo dies würde die Kosten fast nichts, und wenn der aufrufende code ist in der original-Beispiel-weiß, dass keine externen Entitäten wird der Zugang
Y
während der Ausführung vonfunc
, dann code targeting, dass der compiler in der Lage sein, um die geforderte Verhalten ohne eine Diagnose nur durch casting-Y-Adresse, um einefloat*
. Leider, die Menschen, die Aufrechterhaltung der gcc und clang zu glauben scheinen, dass, wenn die Norm bezieht sich auf "nicht-portable oder fehlerhafte Konstrukte", es wirklich bedeutet, "nicht tragbaren, d.h. fehlerhafte Konstrukte", sondern als "Konstrukte, die nicht portabel sind, um jeden einzelnen konforme Maschine im Universum, und wäre irrig wenn eine solche Portabilität bestimmt waren. Gießen Sie den Zeiger, umfloat*
Stille die Warnung auf gcc oder clang, aber ich würde nicht damit rechnen, dass Sie nachgeben, vernünftigen code.InformationsquelleAutor supercat