Как вы используете offsetof () в структуре? - PullRequest
6 голосов
/ 24 августа 2011

Я хочу смещение () строки параметров в mystruct1. Я пробовал

offsetof(struct mystruct1, rec.structPtr1.u_line.line) 

, а также

offsetof(struct mystruct1, line)  

но ни один не работает.

union {
    struct mystruct1 structPtr1;
    struct mystruct2 structPtr2;
} rec;

typedef struct mystruct1 {
    union {
        struct {
            short len;
            char buf[2];
        } line;

        struct {
            short len;
        } logo;

    } u_line;
};

Ответы [ 4 ]

7 голосов
/ 24 августа 2011

Макрос offsetof() принимает два аргумента.Стандарт C99 гласит (в §7.17 <stddef.h>):

offsetof(type, member-designator)

, который расширяется до целочисленного константного выражения типа size_t, значением которого является смещение в байтах, дочлен структуры (обозначенный указателем-членом), с начала его структуры (обозначенный типом).Обозначение типа и члена должно быть таким, чтобы с учетом

static type t;

выражение &(t.member-designator) преобразовывалось в адресную константу.

Итак, вам нужно написать:

offsetof(struct mystruct1, u_line.line);

Однако мы можем заметить, что ответ будет нулевым, поскольку mystruct1 содержит union в качестве первого члена (и только), а часть line является одним элементом объединения,так что будет по смещению 0.

2 голосов
/ 24 августа 2011

Отличная статья на эту тему:

Изучите новый трюк с помощью макроса offsetof ()

Я часто использую макрос offsetof во встроенном кодевместе с модифицированным макросом SIZEOF, как описано в статье.

0 голосов
/ 24 августа 2011

Во-первых, AFAIK, offsetof предназначен для использования только с непосредственными членами структуры (я прав в этом?).

Во-вторых, зная внутренние детали популярных offsetof реализаций, я могу предложить попробовать

offsetof(struct mystruct1, u_line.line) 

Это должно сработать.Соответствует ли это стандарту - это открытый вопрос для меня.

PS Судя по ответу @Jonathan Leffler, это должно сработать.

0 голосов
/ 24 августа 2011

Ваш struct mystruct1 имеет 1 участника с именем u_line. Вы можете увидеть смещение этого члена

offsetof(struct mystruct1, u_line); // should be 0

или членов по линии, если вы укажете каждый «уровень родительства»

offsetof(struct mystruct1, u_line.line);
offsetof(struct mystruct1, u_line.line.buf);
offsetof(struct mystruct1, u_line.logo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...