为什么在编程中cast有强制类型转换的意思?“XXX without a cast”的警告该怎么处理?

C语言或C++在编程时,常常遇到“XXX without a cast”的警告信息,意思是 XXX 没有进行显示的强制类似转换,那么cast为什么会有强制类型转换的意思呢?

从英语的本义来看,cast 有“塑造、铸造”的意思。引申到编程中,就是将一种类型的数据“塑造成”另一种类型。这是一种明确告知编译器进行类型转换的行为

在这里插入图片描述

那么“XXX without a cast”的警告该怎么处理?
举个例子就知道了,比如下面两句代码:

xfer[0].tx_buf = tx_buf;
xfer[0].rx_buf = rx_buf;

在gcc交叉编译时警告如下:

warning: assignment makes integer from pointer without a cast [-Wint-conversion] xfer[0].tx_buf = tx_buf;
warning: assignment makes integer from pointer without a cast [-Wint-conversion] xfer[0].rx_buf = rx_buf; 

代码在 xfer[0].tx_bufxfer[0].rx_buf 赋值时,发生了 “assignment makes integer from pointer without a cast”(从指针赋值给整数变量)的警告。

原因分析
struct spi_ioc_transfer 结构体的 tx_bufrx_buf 字段的类型如下(在 linux/spi/spidev.h):

struct spi_ioc_transfer {
    __u64 tx_buf;  // 用64-bit 无符号整数来存储指针值
    __u64 rx_buf;  // 用64-bit 无符号整数来存储指针值
    ...
};

xfer[0].tx_buf = tx_buf; 这句代码中:

  • tx_bufunsigned char tx_buf[2];,它是 指针(char 数组的地址),实际类型为 unsigned char *
  • tx_buf 赋值给 __u64 类型的 tx_buf,导致 从字符型指针转换到无符号整数,所以编译器给出了警告。

解决方法
将tx_buf、rx_buf这两个字符型指针(里面存储的是地址值)强制显示转换为__u64类型就行了,通常来说,__u64就是unsigned long类型,具体修改后的代码如下:

xfer[0].tx_buf = (unsigned long)tx_buf;
xfer[0].rx_buf = (unsigned long)rx_buf;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值