在树莓派上-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
答案 0 :(得分:11)
我了解在32位系统上,size_t是32位,可能与unsigned long不同,但是仍然可以编译吗?
这是不正确的。您正确地认为类型具有相同的大小,但是大小不是使类型成为类型的原因。例如,我们有signed char
,unsigned char
和char
。这三个文件的大小均为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));