从std :: size_t *到long unsigned int *的无效转换

时间:2019-05-09 13:14:42

标签: c++

在树莓派上-arv7l我正在编译以下C ++程序

#include <iostream>

void fun(unsigned long int* i)
{
    std::cout << *i << std::endl;
}


int main()
{
    std::size_t i = 1;
    fun(&i);
    return 0;
}

对于上面的代码,我收到以下错误:

a.cpp: In function 'int main()':
a.cpp:12:9: error: invalid conversion from 'std::size_t* {aka unsigned int*}' to 'long unsigned int*' [-fpermissive]
     fun(&i);
         ^~
a.cpp:3:6: note:   initializing argument 1 of 'void fun(long unsigned int*)'
 void fun(unsigned long int* i)
      ^~~

我了解在32位系统上,size_t是32位,可能与unsigned long不同,但是仍然可以编译吗?

关于各种类型的大小:

sizeof(size_t): 4
sizeof(unsigned int): 4
sizeof(unsigned long int): 4

sizeof(size_t*): 4
sizeof(unsigned int*): 4
sizeof(unsigned long int*): 4

系统:Linux turtlebot 4.14.79-v7 +#1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU / Linux

编译器:gcc-6.3

4 个答案:

答案 0 :(得分:11)

  

我了解在32位系统上,size_t是32位,可能与unsigned long不同,但是仍然可以编译吗?

这是不正确的。您正确地认为类型具有相同的大小,但是大小不是使类型成为类型的原因。例如,我们有signed charunsigned charchar。这三个文件的大小均为1,但所有三个文件都是由标准命名的不同类型。

在您的情况下,size_t*unsigned int*,并且由于它是与long unsigned int*不同的类型,因此您不能将其隐式转换为一个。

答案 1 :(得分:4)

为什么要编译?您有一个unsigned int(在您的系统上为std::size_t),并假装它是long unsigned int

但是不管大小,它都不是,所以它不起作用。

类型多于宽度。

对可移植代码使用一致的类型。

答案 2 :(得分:3)

unsigned long int*unsigned int*的类型不同,即使大小相同。

整数类型之间存在隐式转换,但是不是不适用于指针整数类型,这就是为什么会出现错误。

您需要更改变量的类型或函数参数的类型,以使其匹配。

答案 3 :(得分:0)

在具有不同大小修饰符的C ++类型中,即使大小相同也有所不同。 有些系统具有sizeof(char)== sizeof(short int)== sizeof(int)== sizeof(long int)...

在您的代码中添加一个std :: static_assert,以确保两种类型的大小相等,并且可以这样调用函数:

fun(&reinterpret_cast<unsigned long&>(i));