class A
{
int x;
int y;
};
class B
{
char x;
char y;
};
struct Metadata
{
int Offset;
int Size;
};
Metadata Test;
Можно ли каким-то образом присвоить Test.Offset смещение члена, например, y из класса A, или, y из класса B? Под смещением я понимаю смещение члена класса в байтах от начала объекта в памяти.
Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?
Здравствуйте, PavelCH, Вы писали:
PCH>Можно ли каким-то образом присвоить Test.Offset смещение члена, например, y из класса A, или, y из класса B? Под смещением я понимаю смещение члена класса в байтах от начала объекта в памяти.
PCH>Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?
Здравствуйте, PavelCH, Вы писали:
PCH>Я пытался делать (int)&B::y ругается, что не может преобразовать выражение к числу int. Но ведь &B::y это е и есть смещение?
PavelCH:
PCH>Можно ли каким-то образом присвоить Test.Offset смещение члена
Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.
Здравствуйте, Николай Ивченков, Вы писали:
PCH>>Можно ли каким-то образом присвоить Test.Offset смещение члена
НИ>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef). А то, что предложил Мухин, — это хак.
В реализации стандартной библиотеки могут использоваться любые особенности компилятора, задокументированные для внутреннего использования и не задокументированные для обычного пользователя. К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному, так если что-то работает в потрохах библиотеки, то ещё не факт, что оно будет так же работать и в пользовательском коде.
Здравствуйте, Николай Ивченков, Вы писали:
СМ>>вот по стандарту
НИ>В реализации стандартной библиотеки могут использоваться любые особенности компилятора, задокументированные для внутреннего использования и не задокументированные для обычного пользователя. К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному, так если что-то работает в потрохах библиотеки, то ещё не факт, что оно будет так же работать и в пользовательском коде.
К чему это? Проблема решена давно, Вы же дали стандартное решение.
Здравствуйте, Николай Ивченков, Вы писали:
НИ>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef).
Только не надо забывать, что применять этот макрос можно только к POD:
18.1 Types [lib.support.types]
. . .
5 The macro offsetof accepts a restricted set of type arguments in this International Standard. type
shall be a POD structure or a POD union (clause 9).
Хотя возможно это ограничение будет снято в будущем.
igna:
НИ>>Для нахождения смещения члена есть стандартный макрос offsetof (для использования в C надо подключать stddef.h, в C++ — cstddef).
I>Только не надо забывать, что применять этот макрос можно только к POD: I>Хотя возможно это ограничение будет снято в будущем.
В C++0x этот макрос можно будет применять ко всем standard-layout классам:
N2914 — 18.2/4:
The macro offsetof(type, member-designator) accepts a restricted set of type arguments in this International Standard. If type is not a standard-layout class (Clause 9), the results are undefined.
N2914 — 9/7:
A standard-layout class is a class that:
— has no non-static data members of type non-standard-layout class (or array of such types) or reference,
— has no virtual functions (10.3) and no virtual base classes (10.1),
— has the same access control (Clause 11) for all non-static data members,
— has no non-standard-layout base classes,
— either has no non-static data members in the most-derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and
— has no base classes of the same type as the first non-static data member.
Здравствуйте, Николай Ивченков, Вы писали:
НИ>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному
Осталось только научить компиляторы различать библиотечный код от пользовательского.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
НИ>>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному V>Осталось только научить компиляторы различать библиотечный код от пользовательского.
А что тут учить? Компиллер по #include<string> может ничего не включать, а просто подгружать результаты компиляции хедера из какого-то архива...
А в хедере string при этом может быть написано что угодно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
НИ>>>К тому же компилятор в принципе может транслировать свой библиотечный код и пользовательский код по-разному V>>Осталось только научить компиляторы различать библиотечный код от пользовательского. E>А что тут учить? Компиллер по #include<string> может ничего не включать, а просто подгружать результаты компиляции хедера из какого-то архива... E>А в хедере string при этом может быть написано что угодно
А если я свой инклуд также назову?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>А если я свой инклуд также назову?
Это запрещено делать. Соответственно у производителей компилятора руки развязаны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
V>>А если я свой инклуд также назову? E>Это запрещено делать. Соответственно у производителей компилятора руки развязаны...
Всмысле? У себя инклуд так и назову..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Всмысле? У себя инклуд так и назову..
Ну и не получится скомпилировать.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Vain, Вы писали:
V>Ну и нафик такой компилятор?
Зато по стандарту
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском