list_entry в Linux

По крайней мере, в Visual Studio, существует больше информации, данной в окне Output Build, а не Ошибочном Списке. У меня была шаблонная ошибка в Ошибочном состоянии Списка, "Не может преобразовать Foo< int> к Foo< int>";. были некоторые строки после фактической ошибки в Окне вывода, которое помогло мне дешифровать, какова фактическая проблема была.

26
задан N 1.1 5 April 2011 в 10:29
поделиться

1 ответ

Этот макрос используется для поиска адреса структуры по одному из ее членов.

Так, например, предположим, что у вас есть структура:

typedef struct
{
    int i;
    int j;
} typestruct;

Первое, что вам нужно знать, это то, что последняя часть макроса:

 &((typestruct *)0)->j

используется для дать смещение члена. Таким образом, это размер в байтах от нулевой памяти, приведенной к типу, к члену. В данном случае это sizeof(int), потому что j только ниже int i; Итак, давайте для простоты предположим, что это выражение имеет значения 4. Вы можете получить тот же результат с помощью макроса

offsetof(typestruct, j);

Теперь мы хотим вычислить адрес temp, где temp равно typestruct temp. Для этого мы просто вычисляем адрес указателя за вычетом позиции члена. Адрес указателя:

(typestruct *)((char *) &temp.j)

Следовательно, вычитание будет:

&temp ==  (typestruct *)((char *) &temp.j) - offsetof(typestruct, j)

или, как говорит макрос:

&temp ==  (typestruct *)((char *) &temp.j) - &((typestruct *)0)->j

Вы можете узнать гораздо больше здесь , а также в этом вопросе .

(круглые скобки необходимы, но были исключены для пояснения)

2
ответ дан 28 November 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: