6

C11と構造体を使用した-Wpaddedで問題が発生しています。

_Alignasを使用したStructureメンバーの配置についてはすでに読みましたが、clangのドキュメントを調べたところ、現在サポートされていることがわかりました。

また、最近トランクから作成した非常に新しいバージョンのclangを使用しています。

$ clang --version
clang version 3.3 (trunk 175473)
Target: x86_64-unknown-linux-gnu
Thread model: posix

私が遭遇している問題はこれです:

#include <stdlib.h>
#include <stdalign.h>

struct foo{
   void* a;
   int b;
};

int main() {
   struct foo instance;

   instance.a = NULL;
   instance.b = 2;

   return 0;
}

これは私にこの警告を投げます:

$ clang -Weverything -std=c11 t.c 
t.c:4:8: warning: padding size of 'struct foo' with 4 bytes to alignment boundary [-Wpadded]
struct foo{
       ^
1 warning generated.

さて、これは何_Alignasのためですか?次のように、intメンバー宣言の前に配置してみました。

struct foo{
   void* a;
   _Alignas(void*) int b;
};

しかし、同じ警告が残っています。また、_Alignasをさまざまな場所に配置してみましたが、役に立ちませんでした。ここで何が欠けていますか?

この特定の警告を無視することができ、パディングが重要である理由を理解しているので、パディングとは何かについての回避策や説明には興味がありません。警告が出ないように、Cをポータブルで標準に準拠した方法で変更する方法を知りたいです。

4

1 に答える 1

2

-WeverythingCが必要とするすべての診断メッセージとCが必要としない一部の診断を出力します。ここに出力される診断はCでは必要ありません。その目的は有益であり、プログラムはすでに厳密に準拠しています。Cは、プログラムの変換に失敗しない限り、実装は追加の診断メッセージを自由に生成できると言います。

于 2013-02-22T18:51:20.727 に答える