传递xxx参数的指针目标在签名方面有所不同

时间:2017-08-23 05:48:43

标签: c pointers

我去编译错误:"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会收到警告。这意味着不同签名的传递指针比不同签名的传递值更危险吗? 或者它是否仅通过编译选项单独配置?

1 个答案:

答案 0 :(得分:0)

int *& unsigned int *是两种不同的指针类型,兼容。

你必须明确地转换指针才能将他转换为另一个。

func2((int*)pMyVar2);

非指针intunsigned int

来自C标准 6.3.1.3

  

当整数类型的值转换为另一个整数类型时   除了_Bool之外,如果值可以用新类型表示,那么   没有改变。

     

否则,如果新类型是无符号的,则转换为   重复加或减一个以上的最大值   可以用新类型表示,直到值在范围内   新类型。

     

否则,新类型已签名且无法表示该值   在里面;结果是实现定义的还是   实现定义的信号被提出。