Freetype 2, построение visual studio 2015

Получение следующего предупреждения:

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

Что кажется довольно странным.

Строка кода, о которой идет речь, это:

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

и glyph_indexобъявляется FT_UInt.

FT_UInt typedef unsigned intтак что довольно странно превращать Ан intВ а void*.

Есть идеи, как справиться с этим предупреждением?

1 ответ

  1. FT_UInt является typedef unsigned int, поэтому довольно странно конвертировать int в void*.

    На самом деле это не так. Это прекрасно и позволяет конвертировать между целыми числами и указателями. Особое применение этого — «пользовательские параметры» к функции, где вы регистрируете целое число или указатель вместе с обратным вызовом функции.

    Однако двукратный typecast (void*)(unsigned long)является рецептом для получения проблем. Это не гарантирует, sizeof(unsigned ling) >= sizeof(void*)что может вызвать все виды проблем (т. е. неопределенное поведение) указателей усекаются.

    Правильными типами для использования, когда кто-то хочет целое число, которое также может содержать указатель, являются uintptr_tи intptr_t.

    Есть идеи, как справиться с этим предупреждением?

    В этом конкретном случае это, скорее всего, не является причиной проблем, потому что этот указатель будет возвращен к FT_UInt. В долгосрочной перспективе имело бы смысл подать вопрос и изменить прототип FT_List_Find, чтобы принять uintptr_tвместо указателя; к сожалению, это также сломает много существующих программ.