Может ли запись варианта Ада быть двоичной, совместимой с объединением C ++? - PullRequest
7 голосов
/ 03 ноября 2011

Я занимаюсь разработкой связующего программного обеспечения для использования в приложении, в котором есть модуль на Аде и много модулей на С ++, который передает передаваемые параметры (скалярные значения) и структуры. Приложение работает в MS Windows XP и Windows 7, часть C ++ разрабатывается в MSVC ++ 2008, часть Ada разрабатывается с использованием GPS / GNAT. Версия Ada 1995 года, но мы находимся в процессе миграции компилятора (более новая версия GPS / GNAT) с возможностью использования более новой спецификации Ada.

Промежуточное программное обеспечение написано на C ++, и я хотел бы использовать тип объединения, содержащий все типы, передаваемые между модулями, поэтому мне не нужно указывать одну функцию put / get для каждого типа, который используется в системе.

Вопрос в том, совместимы ли бинарные союзы C ++ с вариантами записи Ada? Другими словами, если я передам объединение C ++ в код Ada, сможет ли он прочитать его как запись варианта? (и наоборот)

Я думаю, что для того, чтобы это было возможно, понадобятся некоторые корректировки ... (Например, объединения C ++ не содержат члена, который описывает его содержание, в то время как записи варианта Ada делают)

Ответы [ 4 ]

7 голосов
/ 03 ноября 2011

Возможно.

Ada 2005 предоставляет прагму Unchecked_Union , которая позволяет программе "[указать] интерфейсное соответствие между заданным различимым типом и некоторым объединением Си. Прагма указывает, чтосвязанному типу должно быть предоставлено представление, которое не оставляет места для его дискриминанта (ов). "

Из моего прочтения раздела RM каждый объявляет тип Ada с дискриминантом (ами), необходимым для определения варианта записи, но для дискриминанта (ов) не выделено место для хранения.Насколько я понимаю, это означает, что со стороны Ады на дискриминант впоследствии нельзя ссылаться.(Существуют и другие ограничения, так как все поля должны быть C-совместимыми, см. RM B.3.3 для получения дополнительной информации.)

Я никогда не использовал эту прагму, и яне могу не думать, что это потребует некоторых экспериментов, чтобы заставить (надеюсь) работать с вашей системой.Удачи!

5 голосов
/ 03 ноября 2011

Да.

Ada совместима с C / C ++ Unions.См. здесь , чтобы узнать, как это сделать (pdf). В частности, на странице 5 показано, как это сделать с помощью союзов и тегов.Это должно быть то же самое для использования дискриминантных записей.(Предостережение: это, вероятно, не тот компилятор, который вы используете, но я был бы очень удивлен, если бы вы не вели себя так же!)

3 голосов
/ 03 ноября 2011

Как упомянул MSalters, он не будет работать, если в C union по какой-то причине нет поля, обозначающего вариант. Поскольку это не требуется в C, это не будет часто работать. Однако, поскольку вы управляете реализацией этого типа C, вы можете заставить его работать. Просто убедитесь, что прямо перед объединением есть поле, в котором указано, какое объединение используется.

Чтобы сделать его полностью бинарно-совместимым с вашей несущей структурой C, вам, вероятно, потребуется использовать простой тип записи Ada вместе с предложением представления записи, чтобы убедиться, что поля расположены в тех же местах, что и ваша. С компилятором случается их ставить. И да, это делает вас уязвимым для изменений компилятора C, вызывающих изменения макета. Вы можете попытаться защититься от этого с помощью битовых полей в вашем C-коде, но они недостаточно мощны, чтобы действительно выложить вещи так, как это могут сделать предложения Ada rep rep replication. Это одна из причин, по которой мы предпочитаем использовать Аду для низкоуровневой работы.

Я должен упомянуть, что, когда я проверял в последний раз, версия Gnat для Windows не была совместима с компоновщиком двоичных файлов VisualStudio. Единственный известный мне способ заставить эти два компилятора работать вместе, это поместить весь интерфейс в DLL. В противном случае вам, вероятно, потребуется либо использовать GCC для сборки системы C ++, либо использовать другой компилятор Ada, например ObjectAda .

.
2 голосов
/ 03 ноября 2011

Нет. Как вы сами заявляете, записи вариантов Ada содержат поле тега. Союз C не имеет этого. (По крайней мере, не в MSVC ++ и GCC - это разрешено ISO C.)

...