我去编译错误:"pointer targets in passing argument 4 of xxx differ in signedness [-Werror=pointer-sign]"
因为在我的项目中编译警告被视为错误。
但让我感到困惑的是,以下伪代码在func2上发出警告但不在func1上发出警告:
func1(int var1);
func2(int* var2);
my_func()
{
unsigned int myVar1 = xxx;
unsigned int* pMyVar2 = ooo;
func1(myVar1); //no warning
func2(pMyVar2); //warning
}
我认为应该对func1发出警告,因为使用了不同的signedness参数,但只有func2会收到警告。这意味着不同签名的传递指针比不同签名的传递值更危险吗? 或者它是否仅通过编译选项单独配置?
答案 0 :(得分:0)
int *
& unsigned int *
是两种不同的指针类型,不兼容。
你必须明确地转换指针才能将他转换为另一个。
func2((int*)pMyVar2);
非指针int
和unsigned int
来自C标准c99 6.3.1.3
当整数类型的值转换为另一个整数类型时 除了_Bool之外,如果值可以用新类型表示,那么 没有改变。
否则,如果新类型是无符号的,则转换为 重复加或减一个以上的最大值 可以用新类型表示,直到值在范围内 新类型。
否则,新类型已签名且无法表示该值 在里面;结果是实现定义的还是 实现定义的信号被提出。