或者,也許我不應該施放。這是我在做什麼:如何安全地將void *轉換爲C中的int?
我正在寫一段代碼,將Linux設備驅動程序鏈接到更高級別的庫。庫的作者使用void *
(通過typedef
以新名稱)將句柄存儲到描述通信通道的實現特定對象。
我想與庫連接的驅動程序使用int
將句柄存儲到其通道(因爲它們是通過調用open()
調用返回的文件描述符)。所以,在我的代碼中,我從庫中傳入void *
,並且需要使用int
從驅動程序調用東西,反之亦然。碘。E:
// somewhere in the library ...
typedef void* CAN_HANDLE;
// ... in my code
CAN_HANDLE canOpen_driver(s_BOARD *board)
{
int fd;
// ...
fd = open(busname, O_RDWR);
// ...
return (CAN_HANDLE) fd; // <-- not safe, especially not when converting back.
}
別人寫了實際存儲一些結構等地方,並只投三分球之間的適配器,所以沒有大小的問題出現。就我而言,我並不想管理文件描述符,因爲操作系統已經做到了。在我的電腦上,我認爲指針大於int
,所以我可以找到擺脫這種方式的方法,但代碼也進入了嵌入式系統,而且我沒有足夠的經驗來完成任何工作關於這些機器上的類型的大小的假設。
看到全部大寫「CAN_HANDLE」讓我對LOLCODE記憶中的笑話:)不批評你的代碼... – 2011-02-07 15:46:53
是的,我也笑了。該庫充滿了這一點:can_open,can_send等(這是一個CAN總線庫):) – 2011-02-07 15:49:11