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_buf
和 xfer[0].rx_buf
赋值时,发生了 “assignment makes integer from pointer without a cast”(从指针赋值给整数变量)的警告。
原因分析
struct spi_ioc_transfer
结构体的 tx_buf
和 rx_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_buf
是unsigned 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;