我似乎无法理解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 *
值的转换和处理中时,我混淆了为什么会出现隐式转换的警告。
从部分C99标准的7.18.1.4:
以下类型表示与属性有符号整数类型,任何有效 指针空隙可以转化为这种类型,那么转换回指针空隙, ,其结果将比较等于原始指针:
使用intptr_t
上午我误解的标准,或者是GCC只是在其“从指针整数”过于迂腐在这种情况下检查?
这是[上一个问题](http://stackoverflow.com/questions/9492798/using-intptr- t-instead-of-void)有关吗? –
这不是过于迂腐,隐式转换只是警告存在的常见错误来源,请考虑在涉及重载解决方案时它会如何变成疼痛。知道你在做什么,通过做一个(希望是C++风格的)转换来告诉编译器 – StoryTeller
intptr_t是一个普通的整数类型,唯一的保证是它可以保存一个void *的所有相关信息,它是对于其他整数类型不能保证,所以警告是正确的。为什么你想在第一个地方使用整数?通常一个用于低级算术或位操作RESS。然后强烈建议'uintptr_t'。否则,想想三次(!)如果你真的想要一个整数持有一个指针。 – Olaf