2016-04-30 14 views
0

die folgende Warnung bekommen:Freetype 2, Gebäude Visual Studio 2015

ttgload.c(1654): warning C4312: 'type cast': conversion from 'FT_UInt' to 'void *' of greater size 

die eher merkwürdig erscheint.

Die Codezeile in Frage lautet:

if (FT_List_Find(&loader->composites, 
        (void*)(unsigned long)glyph_index)) 

und glyph_index wird FT_UInt erklärt.

FT_UInt ist typedef unsigned int so ist es eher seltsam, eine int in eine void* zu konvertieren.

Haben Sie Ideen, wie Sie mit dieser Warnung umgehen können?

Antwort

0

FT_UInt ist typedef unsigned int, daher ist es ziemlich seltsam, ein int in ein void * zu konvertieren.

Eigentlich ist es nicht. Es ist völlig in Ordnung und erlaubt, zwischen Ganzzahlen und Zeigern zu konvertieren. Eine spezielle Anwendung davon sind "Benutzerparameter" für eine Funktion, bei der Sie eine Ganzzahl oder einen Zeiger zusammen mit einem Funktionsrückruf registrieren.

Allerdings ist die zweifache Typumwandlung (void*)(unsigned long) ein Rezept für Probleme. Es ist nicht garantiert, dass sizeof(unsigned ling) >= sizeof(void*), die verursachen kann, alle Arten von Problemen (d. H. Undefiniertes Verhalten) von Zeigern abgeschnitten werden.

Die richtigen Typen, die verwendet werden, wenn jemand eine ganze Zahl haben möchte, die auch einen Zeiger enthalten kann, sind uintptr_t und intptr_t.

Haben Sie Ideen, wie Sie mit dieser Warnung umgehen können?

In diesem speziellen Fall ist es wahrscheinlich keine Ursache von Problemen, da dieser Zeiger auf einen FT_UInt zurückgeworfen wird. Auf lange Sicht wäre es sinnvoll, ein Problem zu melden und den Prototyp von FT_List_Find zu ändern, um anstelle eines Zeigers eine uintptr_t zu akzeptieren; Leider würde dies auch viele bestehende Programme kaputt machen.

+0

Ich stimme zu, dass es in diesem speziellen Fall kein Problem gibt, aber die Warnungen sind trotzdem vorhanden. Eine Möglichkeit, diese wenigen Warnungen zu entfernen, ist das Ersetzen von "unsigned long" durch "size_t". Die Umwandlung wird also (void *) (size_t), für das der Compiler nicht klagen wird. – huyc