Я не могу понять смысл компилятора GCC, который я получаю, когда пытаюсь присвоить значение void *
переменной intptr_t
. В частности, когда я компилирую с -std=c99 -pedantic
, я получаю следующее предупреждение относительно инициализации переменной z
в строке 7:Нужно ли устанавливать значение void * переменной intptr_t для явного приведения?
предупреждение: инициализации делает целое число от указателя без приведения [-Wint преобразования]
Вот исходный код:
#include <stdint.h>
int main(void){
unsigned int x = 42;
void *y = &x;
intptr_t z = y; /* warning: initialization makes integer from pointer without a cast [-Wint-conversion] */
return 0;
}
Естественно, если я явно бросить y
в intptr_t
то предупреждение исчезнет. Однако я смутил, почему предупреждение присутствует для неявных преобразований, когда вся цель intptr_t
заключается в преобразовании и обработке значений void *
.
Из раздела 7.18.1.4 стандарта C99:
Следующий тип обозначает целочисленный тип с тем свойством, что любой действительный указатель недействительными могут быть преобразованы к этому типу, то преобразуется обратно в указатель на ничтожной, и результат будет сравнивать равна первоначальной указатель:
intptr_t
Am I искажая стандарт, или GCC просто слишком педантичен в «целое число от указателя» проверить в этом случае?
Это [предыдущий вопрос] (http://stackoverflow.com/questions/9492798/using-intptr- t-вместо-void) релевантно? –
Это не слишком педантично. Неявные преобразования - всего лишь достаточно распространенный источник ошибок для существования предупреждения. Подумайте, как это может стать болью при использовании разрешения перегрузки. Так что если вы действительно знать, что вы делаете, сообщить компилятору, выполнив (надеюсь, C++) стиль. – StoryTeller
'intptr_t' - это нормальный целочисленный тип. Единственная гарантия заключается в том, что он может содержать всю соответствующую информацию о« void * », которая не гарантируется для других целых типов, поэтому предупреждение правильное. Почему вы хотите использовать целое число в первую очередь? Обычно это делается для низкоуровневых арифметических или битовых операций над добавлением ССГ. Тогда настоятельно рекомендуется использовать uintptr_t'. В противном случае подумайте трижды (!), Если вы действительно хотите, чтобы целое число удерживало указатель. – Olaf