すでに存在する大きなコードにコードを追加する必要があります。 私のコードに* Ptrというポインタがあります。このポインタの型はunsigned charです。offsetofを使用せずに構造体メンバにオフセットを取得
unsigned char * Ptr;
私は以下の構造を持っています。
struct
{
uint8_t tag;
uint16_t data[size];
bool status;
}Test;
Test *TagData;
ポインタは以下のように型キャストされ、構造体ポインタはポインタPtrが指す位置を指しています。私のコードで
TagData = (Test *)Ptr;
これらの値は、* ptrが指すメモリロケーションにコピーされるように、私は、この構造にいくつかの出力値をコピーします。
構造体のデータ配列にいくつかの値をコピーするには、その構造体メンバへのオフセットを見つける必要があります。私はoffsetof関数を使わずにやりたい私は以下をやってみましたが、コンパイラエラーが出ます。
TagData->data = (uint16_t *) (Ptr + sizeof(TagData->tag));
どのようにすればいいですか?そして、私はoffsetof関数を使いたくありません。これを行う簡単な方法はありますか?
本当の質問は、なぜoffsetofを使いたいのですか?定義の典型的なオフセット( '(int)(&((type *)0) - > member)')を再利用することで簡単に行うことができます。しかし、これはおそらくあなたの問題を解決するものではありません。さて、POD以外のクラスのオフセットが必要で、コンパイラが不平を言っているからです。通常、コンパイラが提供するいくつかの組み込み関数があります。 gccの '__builtin_offsetof'です。 – dim
Cは最小限の機能しか提供しません。したがって、標準的な方法があれば、 'offsetof'は標準に追加されませんでした。 – Olaf
'offsetof'マクロを使用するより簡単な方法は、問題のメンバを直接使用し、そのようなメンバへのポインタを使用することです。 99%のケースでは、整数型とポインタとの間でゲームをやり取りしたり、前後に計算のオフセットを行う理由が全くありません。それをしないでください。それは間違っているだけで、コードを速くすることはできません。ポインタキャストは悪いです。 –