Я написал небольшой фрагмент кода, чтобы понять, как работает смещение макроса в фоновом режиме. Вот код:
#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 ? Похоже, это тип для смещения макроса. Это озадачивает меня.