, у нас есть школьный проект, и нам нужны наши программы C для работы на Linux и совместимы с c99. Поскольку я работаю над Windows 10, я установил Cygwin и предположил, что если он будет компилироваться в cygwin, он, безусловно, будет работать в Linux. Он отлично работает с окнами, и я попытался скомпилировать его в cygwin, и он тоже работает. Могу ли я заверить, что он будет работать в Linux и совместим с C99? Если нет, почему бы и нет? Я использую только stdio и stdlibCygwin: Linux в Windows? Как обеспечить, чтобы программа, созданная в Windows, работала для Linux
ответ
Вы никогда не можете быть уверены. Несмотря на то, что ваша программа работает, она все равно может содержать ошибки, вызывающие неопределенное поведение.
Однако, вы можете снизить риск сбоев, используя лучшие практики, например:
предупреждения Heed компилятора
Усильте предупреждение компилятора. Например:
gcc -Wall -Wextra -pedantic -std=c99
Это поднимает уровень предупреждения на довольно высокий уровень. , Предупреждения компилятора часто указывают на ошибки, поэтому исправить их все. Чтобы убедиться, что вы их исправили, добавьте -Werror
, чтобы вы не могли запускать свой код до тех пор, пока все предупреждения не будут исправлены.
-std=c99
сообщает компилятору использовать правила для версии C99 стандарта C. Текущая версия - C11 (-stdc11
). Это важный флаг, а если опустить gcc
, то по умолчанию используется старый стандарт C89.
Используйте инструмент для обнаружения недействительного использования памяти
инструментов, как Valgrind (Linux) будет сообщать об ошибках общей памяти, как переполнение буфера и утечка памяти. Не уверен, какой инструмент чаще всего используется в Windows, но есть большой выбор, указанный в списке here.
Хорошо, спасибо большое помощник! – user6595053
'-Wextra' возможно? '-Wall' - это всего лишь базовая линия, действительно (и действительно раздражающая ошибка для этого). Вероятно, теперь это будет '-std = c11'. – DevSolar
@DevSolar -Wextra - это хорошо. Добавление! OP явно упомянул, что код должен быть C99. Я добавил дополнительную информацию о '-std' для уточнения. –
Если это ваниль C99, то при 99.9%, если работает на Cygwin, он будет работать на любом Linux. Я никогда не видел случая, который не сработал.
Обратный не всегда верно, я бы оценил ~ 98%, так как связывание может привести к некоторой головной боли на каком-то угловом корпусе.
Если это ваниль C99, он будет работать на * любой * платформе с компилятором C99. Не 99,9% времени, * всегда *. В этом весь смысл языкового стандарта. Cygwin для чего-то другого - те части API Unix/Linux, которые * не * покрыты C99. – DevSolar
Всегда есть теория. Также соответствие C99 компилятора не может быть действительно доказано с большим количеством усилий, которые НИКОГДА не бывают там. – matzeri
Если он не работает, это связано с тем, что программа, компилятор или библиотека не соответствуют требованиям. И я реализовал большие части библиотеки C99, включая * тесты, для межплатформенного использования. Но это не относится к делу. Ваш ответ не отвечает на вопрос ИМХО. – DevSolar
Lol вместо голосования, пожалуйста, просветите меня. Вы можете помочь другим людям таким образом: – user6595053
Трудно помочь вам с такой небольшой информацией, особенно без кода. Но если вы просто используете стандартную библиотеку, не записывая имя файла внутри своего кода, оно, вероятно, будет компилироваться и запускаться в Linux, как на вашем компьютере. Обязательно используйте флаг «-Wall» при компиляции и отсутствии предупреждения. – Garf365
Если код является простым C, а не использует какую-либо конкретную платформу, то да, он должен работать на любом совместимом компиляторе. Обратите внимание, что * код * должен работать, но не исполняемый файл. C - независимая платформа исходного кода. –