また、キャストしないでください。私がやっていることは次のとおりです。C言語のvoid *を安全にintにキャストする方法はありますか?
Linuxデバイスドライバを上位レベルのライブラリにリンクするコードを書いています。ライブラリの作成者は、通信チャネルを記述する実装固有のオブジェクトにハンドルを格納するために、(typedef
によって新しい名前で)を使用します。
ライブラリーと接続したいドライバーは、open()
への呼び出しによって返されるファイル記述子であるため、int
を使用してそのチャネルにハンドルを保管します。だから私のコードでは、void *
がライブラリから渡され、int
を使用してドライバからものを呼び出す必要があり、その逆もあります。 I.電子:
// 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.
}
他の人が実際に書かれているアダプタは、ポインタ間のキャストのどこかに、ちょうどいくつかの構造体などを保存するので、何のサイズの問題は生じません。私の場合は、OSが既にそうしているように、ファイル記述子を本当に管理したくありません。
私のPC上では、ポインタがint
よりも大きいと思うので、私はこれを邪魔してしまうかもしれませんが、コードは組み込みシステムにも入ります。それらのマシン上のタイプのサイズに関する仮定。
すべての大文字の「CAN_HANDLE」を見ると、私はLOLCODE memeの記憶に笑いかけました:)あなたのコードを批判しないでください... –
ええ、私はあまりにも笑った。ライブラリはこれでいっぱいです:can_open、can_sendなど(CANバスライブラリです):) –
'void *'は 'int'よりも小さくすることができますが、私はそれを見たことはないと確信しています。とにかく実際にはfdsは0から始まり、fd番号が大きすぎて 'void *'に格納することができない多くのfdsを作成する前にシステムリソースを使い果たします。これは違う方法ではできないと言っているわけではありませんが、個人的には無効なポインタ値を作成することをシステムがトラップしない限り、私はそれを見ていません。安全であるように、システムがfdsをサポートしているのと同じ数の文字を割り当てることができれば、その配列のn番目の要素へのポインタはfd nを表すことができ、fdごとの割り当てを避けることができます。 –