Здравствуйте Алекс, Вы писали:
А>Привет всем! А>Собственно, сабж. Как определить смещение поля в структуре (можно расширить или обобщить до класса)?
offsetof
Re[2]: смещение поля в структуре
От:
Аноним
Дата:
22.08.02 05:14
Оценка:
Здравствуйте Андрей, Вы писали:
А>Здравствуйте Алекс, Вы писали:
А>>Привет всем! А>>Собственно, сабж. Как определить смещение поля в структуре (можно расширить или обобщить до класса)?
А>offsetof
#include "stdio.h"
typedef struct
{
int a;
int b;
} ms;
int main(int argc, char* argv[])
{
size_t offset;
ms m;
skip
А>Это просто макрос! Неужели нет встроенного средства? А>З.Ы. Как делает offsetof я и сам раньше делал!
Ты просил способ: тебе его указали. А что значит в твоем понимании встроенное средство? И чем тебя offsetof не устраивает? Свое дело он делает и вполне нормально
А>[]
АТ>>Криво. Для этой цели, как уже было сказано, существует 'offsetof' и нечего огород городить.
А>Это просто макрос! Неужели нет встроенного средства?
Более встроенного чем 'offsetof'? Нет. Можно, конечно, вычитать указатели. Но зачем это делать, если есть 'offsetof'?
А>З.Ы. Как делает offsetof я и сам раньше делал!
А как конкретно? Например, в стандартной библиотеке MSVC++ 6 'offsetof' заниматся разыменованием null-указателя. Стандартная библиотека имеет право делать такое в своей реализации. Ты сам в своей программе — нет, т.к. это не является легальным С++.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте Алекс, Вы писали:
[]
АТ>А как конкретно? Например, в стандартной библиотеке MSVC++ 6 'offsetof' заниматся разыменованием null-указателя.
именно так и делал
АТ>Стандартная библиотека имеет право делать такое в своей реализации. Ты сам в своей программе — нет, т.к. это не является легальным С++.
т.е. в легальном С++ нет средства вычисления смещения мемберов структуры/класса?
Здравствуйте Алекс, Вы писали:
А>Привет всем! А>Собственно, сабж. Как определить смещение поля в структуре (можно расширить или обобщить до класса)?
Зависит от того, зачем это нужно. Есть же указатели на члены класса, которые type-safe, правильно работают при различного рода наследованиях (например множественное, включая ромбовидные схемы), ссылках и указателях на базовые классы и т.п.
Что конкретно хочет сделать уважаемый джин?
Привет всем!
Вопрос из той же серии: как определить адрес функции-члена класса (в том числе и виртуальной)? Лучше конечно в общем случае, т.е. когда объект не создан, но можно и для случая когда объект создан.
И еще, что нужно переделать в
typedef int (CALLBACK * MyCallBack) (HWND, UINT, WPARAM, LPARAM);
чтобы переменную типа MyCallBack компиллятор воспринимал как указатель на функцию-член класса?
Здравствуйте SVV, Вы писали:
SVV>Привет всем! SVV>Вопрос из той же серии: как определить адрес функции-члена класса (в том числе и виртуальной)? Лучше конечно в общем случае, т.е. когда объект не создан, но можно и для случая когда объект создан.
SVV>И еще, что нужно переделать в
SVV>
SVV>typedef int (CALLBACK * MyCallBack) (HWND, UINT, WPARAM, LPARAM);
SVV>
SVV>чтобы переменную типа MyCallBack компиллятор воспринимал как указатель на функцию-член класса?