コンパイル時に構造体のメンバのオフセットを見つける方法はありますか?構造体メンバのオフセットを含む定数を作成します。次のコードではoffsetof()
マクロは最初のprintf
ステートメントで機能します。しかし、を宣言するためのライン10での使用には、エラーが発生します。コンパイル時のオフセット
"Cannot resolve '->' operator as a constant expression".
はそれを行うための他の方法はありますか?
struct MyStruct
{
unsigned long lw;
unsigned char c[5];
int i;
int j;
unsigned long last;
};
const int ofs = offsetof(struct MyStruct, i); // This line in error
int main(void)
{
printf("Offset of c = %d.\n", offsetof(struct MyStruct, c));
printf("Offset of i = %d.\n", ofs);
return 0;
}
もちろん、「コンパイル時」という意味ではありません。ライブラリ関数を使用しないコンストラクトを表示しますが、コンパイル時の値に評価されるわけではありません。実際にコードが発行されるかどうかは、もちろん無関係です.Cドラフトは、 "算術定数式は算術型でなければならず、整数定数、浮動定数、列挙定数、文字定数、および式のsizeというオペランドしか持たないものとします。ミックスにはポインタは使用できません。 –
'offsetof'はコンパイル時の構造体であり、整数の定数式に評価されますが、実装例ではそうではありません。 –
offsetof()を整数定数式と評価するものとして定義するには、言語に* NO *ウェイがあります。ポインタを使わずに定義する* NO *方法があります。あなたが何をしているにしても、あなたは常に組み込みのコンパイラや式を適切に最適化するコンパイラの能力に頼るでしょう。 offsetofのWikipedia、またはオープンソースのCライブラリをチェックしてください。だから、あなたは整数定数式の定義について技術的に正しいのですが(そして私の言い回しにも適応します)、私の実装例で指し示すのは間違っています。 – DevSolar