2

このキャストのようなものは合法だと思います(fooはvoidへのポインタです):

struct on_off {
                  unsigned light : 1;
                  unsigned toaster : 1;
                  int count;            /* 4 bytes */
                  unsigned ac : 4;
                  unsigned : 4;
                  unsigned clock : 1;
                  unsigned : 0;
                  unsigned flag : 1;
                 };

((on_off) foo).count = 3;

しかし、このようなものが合法であるかどうか、構造体が定義されていないかどうか疑問に思っています:

((struct {
                  unsigned light : 1;
                  unsigned toaster : 1;
                  int count;            /* 4 bytes */
                  unsigned ac : 4;
                  unsigned : 4;
                  unsigned clock : 1;
                  unsigned : 0;
                  unsigned flag : 1;
         }) foo).count = 3;

...またはこれらの線に沿った何か。

ありがとう!

4

1 に答える 1

3

はい、C では無名構造へのキャストが許可されています。簡単なデモを次に示します。

struct xxx {
    int a;
};
...
// Declare a "real"struct, and assign its field
struct xxx x;
x.a = 123;
// Cast a pointer of 'x' to void*
void *y = &x;
// Access a field of 'x' by casting to an anonymous struct
int b = ((struct {int a;}*)y)->a;
printf("%d\n", b); // Prints 123

ideone のデモ

于 2013-07-23T02:17:55.583 に答える