Смещение макроса с C ++ / CLI - PullRequest
2 голосов
/ 26 марта 2009

Макрос offsetof, похоже, не работает в C ++ / CLI.

Это прекрасно работает в неуправляемом C ++, но выдает «ошибку C2275:« Entity »: недопустимое использование этого типа в качестве выражения» в CLI.

struct Property{
     char* label;
     PropertyTypes type;
     unsigned int member_offset;
     unsigned int position;
     unsigned char bit_offset;
};

struct Entity{
     ...
     bool transparent;
     ...
};

Property property = {"Transparent",     
       TYPE_BOOL,       
       offsetof(Entity, transparent), 
       0, 
       0}; // C2275 HERE

У CLI есть замена?

Ответы [ 4 ]

4 голосов
/ 26 марта 2009

Я полагаю, что сообщение компилятора сводится к следующему: "offsetof" не является известным макросом, и если это была функция, ее параметры не должны содержать имя типа.

Редактировать : Как указывалось в комментариях, offsetof на самом деле является частью библиотеки std. Так что не хватает, вероятно, просто

#include <cstddef>

В качестве альтернативы, вы можете использовать эту реализацию макроса (взято из заголовков Win32 / MFC):

#ifdef _WIN64
    #define OFFSET_OF( s, m )\
      (size_t)((ptrdiff_t)&reinterpret_cast<const volatile char&>((((s*)0)->m)) )
#else
    #define OFFSET_OF( s, m )\
      (size_t)&reinterpret_cast<const volatile char&>((((s*)0)->m))
#endif
1 голос
/ 26 марта 2009

Стандарт C ++ уже имеет альтернативу; &Entity::transparent. Возможно, вы захотите использовать шаблоны при изменении класса Propery. Тип указателя на член является нетривиальным.

0 голосов
/ 26 марта 2009

Просто выстрел в темноте и без шанса перепроверить это - должен

offsetof(Entity, transparent),

возможно, скорее прочитайте

 offsetof( struct Entity, transparent ),

???

0 голосов
/ 26 марта 2009

Вам нужно будет указать тип объекта, который вы назначаете. Похоже, что есть несоответствие типов для рассматриваемого члена.

См. this для примера использования.

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