2016-09-12 3 views
-1

, у нас есть школьный проект, и нам нужны наши программы C для работы на Linux и совместимы с c99. Поскольку я работаю над Windows 10, я установил Cygwin и предположил, что если он будет компилироваться в cygwin, он, безусловно, будет работать в Linux. Он отлично работает с окнами, и я попытался скомпилировать его в cygwin, и он тоже работает. Могу ли я заверить, что он будет работать в Linux и совместим с C99? Если нет, почему бы и нет? Я использую только stdio и stdlibCygwin: Linux в Windows? Как обеспечить, чтобы программа, созданная в Windows, работала для Linux

+2

Lol вместо голосования, пожалуйста, просветите меня. Вы можете помочь другим людям таким образом: – user6595053

+0

Трудно помочь вам с такой небольшой информацией, особенно без кода. Но если вы просто используете стандартную библиотеку, не записывая имя файла внутри своего кода, оно, вероятно, будет компилироваться и запускаться в Linux, как на вашем компьютере. Обязательно используйте флаг «-Wall» при компиляции и отсутствии предупреждения. – Garf365

+1

Если код является простым C, а не использует какую-либо конкретную платформу, то да, он должен работать на любом совместимом компиляторе. Обратите внимание, что * код * должен работать, но не исполняемый файл. C - независимая платформа исходного кода. –

ответ

2

Вы никогда не можете быть уверены. Несмотря на то, что ваша программа работает, она все равно может содержать ошибки, вызывающие неопределенное поведение.

Однако, вы можете снизить риск сбоев, используя лучшие практики, например:

предупреждения Heed компилятора

Усильте предупреждение компилятора. Например:

gcc -Wall -Wextra -pedantic -std=c99 

Это поднимает уровень предупреждения на довольно высокий уровень. , Предупреждения компилятора часто указывают на ошибки, поэтому исправить их все. Чтобы убедиться, что вы их исправили, добавьте -Werror, чтобы вы не могли запускать свой код до тех пор, пока все предупреждения не будут исправлены.

-std=c99 сообщает компилятору использовать правила для версии C99 стандарта C. Текущая версия - C11 (-stdc11). Это важный флаг, а если опустить gcc, то по умолчанию используется старый стандарт C89.

Используйте инструмент для обнаружения недействительного использования памяти

инструментов, как Valgrind (Linux) будет сообщать об ошибках общей памяти, как переполнение буфера и утечка памяти. Не уверен, какой инструмент чаще всего используется в Windows, но есть большой выбор, указанный в списке here.

+0

Хорошо, спасибо большое помощник! – user6595053

+0

'-Wextra' возможно? '-Wall' - это всего лишь базовая линия, действительно (и действительно раздражающая ошибка для этого). Вероятно, теперь это будет '-std = c11'. – DevSolar

+0

@DevSolar -Wextra - это хорошо. Добавление! OP явно упомянул, что код должен быть C99. Я добавил дополнительную информацию о '-std' для уточнения. –

0

Если это ваниль C99, то при 99.9%, если работает на Cygwin, он будет работать на любом Linux. Я никогда не видел случая, который не сработал.

Обратный не всегда верно, я бы оценил ~ 98%, так как связывание может привести к некоторой головной боли на каком-то угловом корпусе.

+0

Если это ваниль C99, он будет работать на * любой * платформе с компилятором C99. Не 99,9% времени, * всегда *. В этом весь смысл языкового стандарта. Cygwin для чего-то другого - те части API Unix/Linux, которые * не * покрыты C99. – DevSolar

+1

Всегда есть теория. Также соответствие C99 компилятора не может быть действительно доказано с большим количеством усилий, которые НИКОГДА не бывают там. – matzeri

+0

Если он не работает, это связано с тем, что программа, компилятор или библиотека не соответствуют требованиям. И я реализовал большие части библиотеки C99, включая * тесты, для межплатформенного использования. Но это не относится к делу. Ваш ответ не отвечает на вопрос ИМХО. – DevSolar