По крайней мере, в Visual Studio, существует больше информации, данной в окне Output Build, а не Ошибочном Списке. У меня была шаблонная ошибка в Ошибочном состоянии Списка, "Не может преобразовать Foo< int> к Foo< int>";. были некоторые строки после фактической ошибки в Окне вывода, которое помогло мне дешифровать, какова фактическая проблема была.
Этот макрос используется для поиска адреса структуры по одному из ее членов.
Так, например, предположим, что у вас есть структура:
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
Вы можете узнать гораздо больше здесь , а также в этом вопросе .
(круглые скобки необходимы, но были исключены для пояснения)