Как упомянул MSalters, он не будет работать, если в C union по какой-то причине нет поля, обозначающего вариант. Поскольку это не требуется в C, это не будет часто работать. Однако, поскольку вы управляете реализацией этого типа C, вы можете заставить его работать. Просто убедитесь, что прямо перед объединением есть поле, в котором указано, какое объединение используется.
Чтобы сделать его полностью бинарно-совместимым с вашей несущей структурой C, вам, вероятно, потребуется использовать простой тип записи Ada вместе с предложением представления записи, чтобы убедиться, что поля расположены в тех же местах, что и ваша. С компилятором случается их ставить. И да, это делает вас уязвимым для изменений компилятора C, вызывающих изменения макета. Вы можете попытаться защититься от этого с помощью битовых полей в вашем C-коде, но они недостаточно мощны, чтобы действительно выложить вещи так, как это могут сделать предложения Ada rep rep replication. Это одна из причин, по которой мы предпочитаем использовать Аду для низкоуровневой работы.
Я должен упомянуть, что, когда я проверял в последний раз, версия Gnat для Windows не была совместима с компоновщиком двоичных файлов VisualStudio. Единственный известный мне способ заставить эти два компилятора работать вместе, это поместить весь интерфейс в DLL. В противном случае вам, вероятно, потребуется либо использовать GCC для сборки системы C ++, либо использовать другой компилятор Ada, например ObjectAda .
.