Почему этот образец .NET StructLayout для C ++ - PullRequest
0 голосов
/ 23 марта 2009

С http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute(VS.71).aspx:

[C++] 

[StructLayout(LayoutKind::Explicit, Size=16, CharSet=CharSet::Ansi)]
__value class MySystemTime {
public:
   [FieldOffset(0)] short int wYear;
   [FieldOffset(2)] short int  wMonth;
   [FieldOffset(4)] short int  wDayOfWeek;
   [FieldOffset(6)] short int  wDay;
   [FieldOffset(8)] short int  wHour;
   [FieldOffset(10)] short int  wMinute;
   [FieldOffset(12)] short int  wSecond;
   [FieldOffset(14)] short int  wMilliseconds;
};

Представляю ли я это, или элементы в квадратных скобках не соответствуют синтаксису C ++?

Зачем делать все это, когда C ++ предоставляет адекватные инструменты для определения структуры структуры в пределах стандартного определения языка (и, возможно, с помощью обычно поддерживаемой #pragma pack ()). Разве совместимость, заложенная в язык, не гарантирует, что вы можете определить в C ++ любую структуру, которую вы можете определить в C? Я понимаю необходимость иметь возможность явного описания макета структуры C в других языках, но кажется, что в C ++, который предоставляет

, это не понадобится
extern "C" { }

1 Ответ

1 голос
/ 23 марта 2009

Вещи в квадратных скобках называются атрибутами и часто появляются в коде C #. Похоже, они имеют то же значение, что и не совсем C ++. У этого есть расширения Microsoft, чтобы позволить интеграцию с CLI.

Когда вы объявляете такую ​​структуру в C или C ++, это не гарантирует конкретную структуру памяти. Чтобы контролировать это, вам нужны специальные прагмы для контроля «упаковки». Это зависит от платформы. Итак, то, что вы видите здесь, это всего лишь CLR-эквивалент этого.

Обновление: этот пример взят из документации для более старой версии интеграции Microsoft CLI для C ++, которая называлась Managed C ++. Он был очень быстро заброшен и заменен в следующей версии на C ++ / CLI - привлечение функций CLI в C ++, которое настолько полно и широко, что фактически становится другим языком, так же как C ++ - другим язык от до

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