Это интересный вопрос. Как вы говорите, компиляция кода как кода на C правильно не приводит к ошибкам. И только MSVC, кажется, имеет проблемы с ним при компиляции в виде кода C ++.
Поскольку другие компиляторы C ++ не имеют проблем с кодом, это может быть ошибкой в MSVC, но я могу понять, как MSVC может найти обоснование этой ошибки. Когда компилятор C ++ попадает в строку:
struct Test;
Это неполное объявление struct Test
- компилятор не знает, будет ли полное определение struct Test
содержать специфичные для C ++ элементы (виртуальные функции, наследование и т. Д.). Обратите внимание, что типы в блоке extern "C"
могут по-прежнему использовать все средства C ++; спецификация языковой связи extern "C"
применяется только к «типам функций всех описателей функций, имен функций и имен переменных, введенных объявлением (ями)» (7.5 / 4 «Спецификации связи»).
Итак, я мог видеть, как, когда компилятор C ++ MSVC сталкивается с функцией extern "C"
, которая возвращает неполный тип, он может решить, что ему нужно вернуть ошибку в тот момент, если тип окажется не простым C в стиле POD.
Стандарт C ++ говорит (7.5 / 9 «Спецификации сцепления»):
Связь с C ++ с объектами, определенными в других языках, и с объектами, определенными в C ++ из других языков, определяется реализацией и зависит от языка. Только там, где стратегии размещения объектов двух языковых реализаций достаточно похожи, такая связь может быть достигнута.
Таким образом, MSVC может иметь некоторую свободу действий (по стандартам), если у него есть причина не разрешать extern "C"
функциям возвращать объекты, отличные от POD, хотя я не уверен, почему MSVC будет иметь проблемы, когда другие компиляторы Windows «т. Если кто-то знает подробности (или если они знают, что я просто за пределами базы), я был бы признателен за примечание.
Не то чтобы это вам помогло - это только мое предположение в обосновании.
Не зная больше о вашем процессе codegen и о том, как вы можете повлиять на него, я не уверен, какие приличные варианты у вас могут быть - возможно, пост-обработка сгенерированных файлов, чтобы отделить материал, который необходимо скомпилировать как C (или переставить объявления). Но я могу представить, что это может быть кошмаром, чтобы работать и особенно поддерживать.