Можно ли скомпилировать код C89 на MS Windows? - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь работать с устаревшим кодом C89, и у меня возникают проблемы с его сборкой.Моя обычная среда - Visual Studio, но, похоже, она поддерживает только C99, и некоторые функции C99 (например, stdio и т. Д., Которые не обязательно являются постоянными) нарушают код - lot .Прежде чем я начну вмешиваться в код, я хочу написать несколько тестов, чтобы не нарушать старое поведение, но я не могу проверить тесты, так сказать, до того, как смогу получить код для сборки.

Так есть ли еще способ компилировать код C89 в Windows?

Редактировать: Стив Саммит определил, что stdio и т. Д. никогда не гарантированы;это просто особенность некоторых компиляторов, от которых мой устаревший код зависит довольно глубоко.Таким образом, мой вопрос переходит к тому, существует ли какой-либо компилятор Windows C (желательно бесплатный!) Для Windows, который поддерживает это предположение.Кроме того, у меня есть установка Ubuntu на виртуальной машине, хотя у меня мало опыта ее использования - есть ли такой компилятор в Ubuntu?

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

[Это не совсем ответ, но слишком сложный для комментария.]

Если у вас есть код, который делает такие вещи, как

#include <stdio.h>
FILE *ifp = stdin;
int main() { ... }

и если ваша проблема заключается в ошибках, указывающих, что stdin не является константой времени компиляции, подходящей для статического инициализатора, я думаю, вам придется переписать этот аспект вашего кода. Я могу ошибаться, но если я правильно помню, мысль о том, что stdin et al. если константы времени компиляции никогда не были гарантией, просто полезным свойством самых ранних реализаций Unix. Это не обязательно относится ко всем старым реализациям, поэтому «изменение» в Стандарте, в котором явно сказано, что они не обязательно являются постоянными, не было изменением само по себе , а скорее более или менее кодификацией расхождения существующей практики.

(Другими словами, если у вас есть компилятор, который отклоняет код, и даже если у него есть режим обратной совместимости, я был бы удивлен, если бы режим обратной совместимости превратил stdin в компиляцию постоянная времени.)

1 голос
/ 22 мая 2019

Все поддерживаемые (и даже более старые) версии Visual Studio вполне способны компилировать код C89.Кроме того, C99 обратно совместим с предыдущими версиями языка, поэтому компилятор C99 должен иметь возможность компилировать просто прекрасный код C89.

Хотя вы можете получить некоторые предупреждения, код должен скомпилироваться и работать нормально, если кодконечно, портативен.

0 голосов
/ 25 мая 2019

MSVC - это компилятор C ++, который недавно получил поддержку C99.Ранее он поддерживал только C89 с некоторыми расширениями MS.Для компиляции в строгом режиме C89 используйте опцию /Za.Обязательно включите /Tc для использования режима C

/Za, /Ze (отключить языковые расширения)

Компилятор /Zaопция отключает и выдает ошибки для расширений Microsoft для C, которые не совместимы с ANSI C89 / ISO C90.Устаревшая опция компилятора /Ze включает расширения Microsoft.Расширения Microsoft включены по умолчанию.

См. Применение стандарта ANSI C в Visual Studio 2015

Большинство других компиляторов используют другие параметры, такие как -ansi, -std=c90 или -std=iso9899:1990


Однако, если значение stdin / stdout не является постоянным при использовании в списке статических инициализаторов, тогда оно совершенно не имеет отношения к C89 и фактически является XY проблема .Следующий фрагмент кода без проблем компилируется в режиме C2019 C ++, поэтому, если у вас нет возможных конфликтов, просто скомпилируйте код в режиме C ++

#include <stdio.h>
FILE* ifp = stdout;
int main()
{
    fprintf(ifp, "test\n");
    return 0;
}

В противном случае это легко исправить, чтобы компилировать в режиме C, перемещаяинициализация в main()

FILE* ifp = NULL;
int main()
{
    ifp = stdout;
    fprintf(ifp, "test\n");
    return 0;
}
...