- ベストアンサー
コンパイル時リマークに関する疑問
- Cプログラムコンパイルにて出力されるリマークに関して、正しい解釈を教えてください。
- 構造体を宣言する際、出力されるリマークを避けるためにはどうすれば良いですか?
- リマークにおいてパディングバイトの挿入は問題ありませんが、ポインタを介して構造体のフィールドにアクセスする際にハードコードされたオフセットを使用しないようにし、代わりにオフセットのマクロを使用する必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
後半はおよそ「構造体のメンバをポインタ経由でアクセスするときにはハードコードしたオフセットを使わないで offset of マクロを使え」って意味ですぜ>#4. ・なぜか「offset of」と空白が入っている ・そもそも無名構造体では offsetof が使えない という点で謎の文章ですが, 同じ文章を持つ別のリマークがあるので「同じだと思ってコピペした」とか, その程度のことではないかと.
その他の回答 (4)
- wormhole
- ベストアンサー率28% (1626/5665)
>確かにstructの後にタグ名付いてないですね。再現できる環境が手元にないため明日試してみます。 何か微妙に勘違いされてる気がしますけど私は構造体が無名であることを指摘してるわけじゃないですよ。 私が#2で書いていた「メッセージは無名の構造体についての事」というのは「メッセージは無名の構造体についてのパディングに関する指摘」ということだったんですが(パディングの付与されることの注意の対象が、無名の構造体 ってことです)。 自信はありませんけどメッセージの後半は 構造体のフィールドにポインタでアクセスする際には無名の構造体だとoffsetofマクロは使用できないので、オフセット値をハードコーディングしてないか確認してください。 って事かと思います(構造体のフィールドにポインタでアクセスする方が稀なケースだとは思うけど)。 そういう意味では >アライメント境界まで空き領域をなくしてあげることでリマークがでないことは確認できましたので、やはりパディングが付与されることの注意ではないかと思っています。 の対処もアライメントはコンパイルオプション等で変更できますのでよくないと思います。
お礼
>「メッセージは無名の構造体についての事」というのは「メッセージは無名の構造体についてのパディングに関する指摘」ということだったんですが そうですね。正確に英語が読めなくても、そのぐらい解釈しろという感じですね。。。お恥ずかしい。
- Tacosan
- ベストアンサー率23% (3656/15482)
うぅ~ん, 「名前を付ければアライメントは気にしなくていい」という性格のものじゃないんだけどなぁ... と思って調べたら Code Advisor Diagnostics Reference に 4255 padding size of struct %sq1 with %s2 bytes to alignment boundary ってメッセージがある. そしてこの 4255 と 4264 の「Action」の文章が一字一句同じ (苦笑). 余談: マクロの名前は offset of じゃなくて offsetof なんだけど, 構造体名を要求するため ISO に従う限り無名構造体では使えない.
お礼
無名の構造体じゃない場合は4255でリマークをだすんですね。 >余談: マクロの名前は offset of じゃなくて offsetof なんだけど, offset of macroはoffsetofマクロのことを言っているんですか!! 気づけなかった。。。
- wormhole
- ベストアンサー率28% (1626/5665)
質問文に書かれてるメッセージは無名の構造体(タグ名もなくtypedefで型定義もしていない)についての事のようですので、無名の構造体を使用しなければよいのではないでしょうか。
お礼
回答ありがとうございます。 確かにstructの後にタグ名付いてないですね。再現できる環境が手元にないため明日試してみます。 ただ、本日同環境で色々試してみたところ、アライメント境界まで空き領域をなくしてあげることでリマークがでないことは確認できましたので、やはりパディングが付与されることの注意ではないかと思っています。 構造体のメンバ構成が変えられない場合に同事象によって各メンバのデータまで影響が及ばないかを懸念しています。
- Tacosan
- ベストアンサー率23% (3656/15482)
「バイト境界」っていわれるとビットフィールドかと思ってしまいそう. 普通は「アラインメント」じゃないかな. int が 4バイトかどうかは知らんけど. 出力しない方法は.... コンパイラのマニュアルでしかるべきオプション (なり設定なり) を探す.
お礼
回答とご指摘ありがとうございます。 アライメント境界と書くべきだったのですね。 自分で調べていたときにアライメント境界と説明している資料もあったのですが、一般的に使う言葉か分からなかったので言葉を変えてしまいました。。。 出力しない方法はコンパイルオプションでの非表示ではなく、根本的な原因解決方法を聞きたかったのですが説明がヘタクソでした。 C言語の前に日本語力ですね。。。
お礼
>後半はおよそ「構造体のメンバをポインタ経由でアクセスするときにはハードコードしたオフセットを使わないで offset of マクロを使え」 なるほど! この訳でリマークに対する説明がしっくりきました。 本日、環境で試してみたところ構造体のメンバ内のデータには特に悪さをしないようでした。パディングが付与されるのを避けられない構成としなければならない場合は、構造体全体サイズやオフセット値に気をつけた処理にすることで対処しようと思います。 Tacosanさん、wormholeさん つたない質問に何度もご回答ありがとうございました。