Преобразование кода C99 в C89

У меня есть код, написанный для VS2015 в соответствии со стандартом C99 для создания статической и динамической библиотеки, которая будет использоваться для другой части проекта.

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

Я нашел этот инструмент, https://github.com/libav/c99-to-c89 и просто загрузил двоичные файлы, которые будут использоваться для преобразования, вместо того, чтобы сначала собирать их из исходного кода.

Итак, я получаю эти 3 файла, которые нужно использовать: «c99wrap.exe», «c99conv.exe», «makedef».

Все, что говорится в файле Readme об его использовании, это: «Использование

c99conv преобразует предварительно обработанные исходные коды C, предоставленный c99wrap использует препроцессор C, преобразует его вывод и передает его компилятору C.

c99wrap $CC $CFLAGS источник

"

Может ли кто-нибудь помочь мне и сказать, как я должен использовать эти файлы .exe для преобразования C-кодов C99 в соответствующие коды C-89?

Мне просто нужен конвертированный код. Который можно использовать в любой версии VS, следующей за форматом C89.


person Fahad    schedule 11.05.2016    source источник
comment
Это такая большая проблема, чтобы сделать резервную копию вручную? На самом деле, я бы не стал доверять автомату.   -  person Eugene Sh.    schedule 11.05.2016
comment
Это огромный код со многими используемыми файлами. Объединенная версия кода содержит около 11 500 строк. У меня 1800 Ошибок из-за этого несоответствия стандарту. Пытался исправить вручную, но их слишком много, счет до 1800 не уменьшается. Ручное изменение средств, изменение всех инициализаций структур и присвоения значений, которые широко использовались в коде. И забудьте о случайных промежуточных инициализациях в каждом блоке кода. Нужно что-то, что может автоматически делать это   -  person Fahad    schedule 11.05.2016
comment
См. также stackoverflow.com/q/10804162.   -  person Arto Bendiken    schedule 01.09.2018


Ответы (1)


Многие функции C99 просто не переносятся на C89 с самого начала. Таким образом, «волшебный инструмент» может сделать только так много, что вам придется делать многое вручную. Примеры наиболее часто используемых функций:

Не портативный:

  • Эффективный тип и строгое сглаживание. «Эквивалент» C89 - это неопределенное поведение.
  • restrict указатели. C89 не имеет эквивалента.
  • VLA. C89 не имеет эквивалента.
  • Гибкие элементы массива. «Эквивалент» C89 - это неопределенное поведение.
  • длинная длинная поддержка. C89 не имеет эквивалента, но может поддерживаться как расширение компилятора.
  • Надежное целочисленное деление целых чисел со знаком. C89 не имеет эквивалента.

Портативный:

  • stdint.h, inttypes.h, stdbool.h. Возможно, поддерживается как расширение компилятора. В качестве альтернативы вы можете ввести их самостоятельно.
  • Составные литералы. Можно заменить временными локальными переменными.
  • Объявления переменных где угодно. Просто переместите их в верхнюю часть блока/из цикла.
  • // Комментарии. Скорее всего поддерживается как расширение компилятора. В противном случае замените на /* */
  • Назначенные инициализаторы. Можно напрямую заменить старомодными списками инициализаторов.
  • встроенные функции. Вероятно, поддерживается как расширение компилятора.
person Lundin    schedule 11.05.2016
comment
Привет, спасибо за ответ. Так что мне придется делать это вручную. :/ Так что теперь я думаю о том, чтобы скомпилировать его как код на C++ и попытаться удалить остальные ошибки вручную. Когда я это делаю, ошибок намного меньше, все равно приходится исправлять 500 ошибок вручную. Что вы думаете об этом подходе? - person Fahad; 11.05.2016