Собственное смещение реализации выдает предупреждение - PullRequest
0 голосов
/ 03 февраля 2020

Я написал небольшой фрагмент кода, чтобы понять, как работает смещение макроса в фоновом режиме. Вот код:

#include <stdio.h>   
#include <stdlib.h>  

int main(void)
{
    /* Getting the offset of a variable inside a struct */
    typedef struct {
        int a;
        char b[23];
        float c;
    } MyStructType;

    unsigned offset = (unsigned)(&((MyStructType * )NULL)->c);

    printf("offset = %u\n", offset);

    return 0;
}

Однако, если я запускаю его, я получаю предупреждающее сообщение:

ПРЕДУПРЕЖДЕНИЕ: приведение от указателя к целому числу другого размера [-Wpointer-to-int- cast]

Однако, если я посмотрю на исходное смещение макроса в c, код будет выглядеть следующим образом:

#include <stdio.h>   
#include <stdlib.h> 
#include <stddef.h> 

int main(void)
{
    /* Getting the offset of a variable inside a struct */
    typedef struct {
        int a;
        char b[23];
        float c;
    } MyStructType;

    unsigned offset = offsetof(MyStructType, c);

    printf("offset = %u\n", offset);

    return 0;
}

Так почему я получаю предупреждение, когда я приведу к unsigned ? Похоже, это тип для смещения макроса. Это озадачивает меня.

1 Ответ

3 голосов
/ 03 февраля 2020

Как прокомментировал mch, unsigned - неправильный тип; он 32-битный практически во всех реальных системах. Макрос offsetof должен давать результат типа size_t, к которому вам «следует» привести. Я думаю, что вас смущает код, который вы нашли, сохраняющий результат в объект типа unsigned; это нормально, если они уверены, что значение мало, но это не означает, что тип выражения offsetof(MyStructType, c); был unsigned. C позволяет тихо назначить больший целочисленный тип меньшему.

Однако, независимо от того, что вы делаете, это недопустимая реализация offsetof и имеет неопределенное поведение (путем применения -> к неверному указателю). То, как вы получаете рабочий offsetof без UB - #include <stddef.h>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...