LINUX.ORG.RU

Как вичислить смещение до элемента структуры


0

1

Добрый день.

Есть ли способ вычислить смещение до элемента структуры на этапе компиляции?

т.е. имеем объявление структуры типа:

struct A {
  int x;
  int y;
};

Можно вычислить смещение до y примерно таким способом:

struct A a;
unsigned int y_offset = (void *)&a.y - (void *)&a;

Но данное вычисление будет работать на этапе выполнения программы.

Как сделать тоже самое, но на этапе компиляции? Ведь компилятор знает это значение.

★★★★

Ответ на: комментарий от staseg

Понял. Берется указатель члена фейковой структуры, якобы лежащей по нулевому адресу. Он и есть смещение.

staseg ★★★★★
()

Спасибо всем! Как-то сразу до этого не додумался.

Dead ★★★★
() автор топика
Ответ на: комментарий от Deleted

Хз, может я туплю, но cc это даже не компилирует. И чем будет результат? Указателем, сдвинутым на нужное смещение относительно NULL?

Zorn
()
Ответ на: комментарий от Deleted

Причём, разве можно складывать два указателя? Можно либо числа складывать, либо указатель с целым типом, не?

Zorn
()
Ответ на: комментарий от Zorn

Усе ОК:

cat 1.c 
#include <stdio.h>

main(){
	struct A {
		int x;
		int y;
	};

	long y_offset = (long)((void*)&((struct A*) NULL)->y - NULL);
	printf("Offset = %ld\n", y_offset);
}


gcc 1.c && ./a.out 
Offset = 4

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Zorn
$ cat test.c 
#include <stdio.h>
#include <stddef.h>

struct A
{
	int x;
	int y;
};

int main(void)
{
	ptrdiff_t y_offset;
	y_offset = (void *) &((struct A *) NULL)->y - NULL;
	printf("%td\n", y_offset);
	return 0;
}

$ gcc -Wall -o test test.c

$ ./test 
4
Deleted
()
Ответ на: комментарий от Zorn

Причём, разве можно складывать два указателя? Можно либо числа складывать, либо указатель с целым типом, не?

Можно находить разницу между двумя указателями. Результат - ptrdiff_t.

Deleted
()
Ответ на: комментарий от Deleted

Дык, понятное дело - ptrdiff_t надо использовать. Но для примера сойдет.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

Ох, моя вина. Не привел эту фигню к (void*), прежде чем NULL вычитать. Да, глупо вышло

Zorn
()
Ответ на: комментарий от Zorn

Тьфу ты. Я даже тело темы не прочитал. Позор мне!

Прошелся по представленным в теме ссылочкам. Это что же получается: в gcc нет механизма, позволяющего определить на этапе препроцессора, как он будет выравнивать элементы структуры?

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)

Есть ли способ вычислить смещение до элемента структуры на этапе компиляции?

Нет. Чего ты хочешь добиться?

vahtu
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.