C программа кросс-платформенные различия в Windows и Unix ОС

Есть ли какое-либо различие в C, который записан в Windows и Unix?
Я преподаю C, а также C++, но некоторые мои студенты возвратились, говоря, что некоторые примеры программ не работают за ними в Unix. Unix чужд мне. К сожалению, никакой опыт с ним вообще. Все, что я знаю, должно записать его. Если существуют какие-либо различия затем, я должен советовать нашему отделу вкладывать капитал в системах для Unix как в настоящее время в нашей лаборатории нет никаких систем Unix. Я не хочу, чтобы мои студенты чувствовали, что им отказали или держались подальше что-то.

11
задан S.L. Barth - Reinstate Monica 24 July 2012 в 10:16
поделиться

9 ответов

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

  • нестандартных, специфичных для платформы включений (, , , ... );
  • неопределенное поведение (fflush(stdin), как кто-то сообщил, не обязан делать ничего по стандарту - это фактически неопределенное поведение вызывать fflush на чем-либо, кроме выходных потоков; в целом, старые компиляторы были более снисходительны к нарушению некоторых тонких правил, таких как строгий алиасинг, так что будьте осторожны с "умными" трюками с указателями);
  • размер типа данных (предположение short=16 бит, int=long=32 бита действует не везде - 64-битный Linux, например, имеет 64-битный long);
  • в частности, размер указателя (void * не всегда 32-битный, и не всегда может быть безопасно приведен к unsigned long); В целом, следует быть осторожным с преобразованиями и сравнениями, в которых участвуют указатели, и всегда использовать для таких задач предоставленные типы вместо "обычных" intов (см., в частности, size_t, ptrdiff_t, uintptr_t)
  • тип данных "внутренний формат" (в стандарте не сказано, что floats и doubles находятся в IEEE 754, хотя я никогда не видел, чтобы платформы делали это иначе);
  • нестандартные функции (__beginthread, функции MS safe strings; с другой стороны, расширения POSIX/GNU)
  • расширения компилятора (__inline, __declspec, #pragmas, .... .. ) и вообще все, что начинается с двойного подчеркивания (или даже с одинарного подчеркивания, в старых, нестандартных реализациях);
  • консольные escape-коды (обычно это проблема, когда вы пытаетесь запустить Unix-код в Windows);
  • формат возврата каретки: в обычных строках это \n везде, но при записи в файл это \n на *NIX, \r\n на Windows, \r на Mac доOSX; преобразование обрабатывается автоматически файловыми потоками, поэтому будьте осторожны, открывайте файлы в двоичном режиме когда вы действительно хотите записать двоичные данные, и оставляйте их в текстовом режиме, когда вы хотите записать текст.

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

Подробности о программе я еще не получил. Студенты были из нашей предыдущей группы. Они попросили об этом. В настоящее время используется turbo C.

Как было сказано в комментарии, пожалуйста, откажитесь от Turbo C и (если вы используете его) Turbo C++, в настоящее время они оба являются куском истории и имеют много несовместимостей с текущими стандартами C и C++ (и, если я хорошо помню, они оба генерируют 16-битные исполняемые файлы, которые даже не будут работать на 64-битных ОС на x86_64).

Существует множество бесплатных, работающих и соответствующих стандартам альтернатив (VC++ Express, MinGW, Pelles C, CygWin под Windows, а gcc/g++ является стандартом де-факто в Linux, соперничая с clang), вам просто нужно выбрать одну.

15
ответ дан 3 December 2019 в 01:44
поделиться

Синтаксис C должен быть одинаковым, если компиляторы Windows и Unix придерживаются одного и того же стандарта C. Мне сказали, что компиляторы MS по-прежнему не поддерживают C99 в полной мере, хотя компиляторы Unix обладают высокой скоростью, поэтому кажется, что C89 - это наименьший общий знаменатель.

Однако в мире Unix вы обычно будете использовать системные вызовы POSIX для выполнения системных задач, таких как IPC и т. Д. Windows не является системой POSIX, поэтому для нее используется другой API.

2
ответ дан 3 December 2019 в 01:44
поделиться

У меня есть комментарий к тем, кто говорит, что вы никогда не должны делать GC вручную. Я привык к ручному управлению памятью на C++ и предпочитаю sharedptr намного больше, чем GC, но в любом случае.

Есть конкретный случай, когда я не могу найти другое решение, чем GC. Обратите внимание: у меня есть класс DataCache, то, как он работает, он сохраняет объекты результата для определенных вызовов метода, которые отправляют обновленные события при обновлении/получении данных. Способ обновления кэша заключается в том, что я просто очищаю все результаты из него и посылаю событие, которое заставляет всех остальных прослушивателей повторно запрашивать свои данные, и прослушиватели, которые вышли за пределы области, не должны повторять запрос, который очищает ненужные результаты. Но, видимо, если я не могу заставить всех слушателей, которые все еще висят, ожидая, пока GC будет очищен немедленно, прежде чем отправить событие «спроси вас данные снова», эти зависшие слушатели будут запрашивать данные снова без необходимости. Так как я не могу удалить EventListener, потому что у AS3 нет деструкторов, я не вижу другого простого решения, чем заставить GC убедиться, что больше нет болтающихся слушателей.

(Изменить) В дополнение к этому, я не могу в любом случае использовать remureEventListener для привязки, которые были настроены в mxml, например (с помощью моего пользовательского класса DataCacher, который обрабатывает remoteobj)

<mx:DataGrid id="mygrid" dataProvider="{DataCacher.instance().result('method').data}" ... />

Когда всплывающее окно, содержащее эту базу данных, закрыто, ожидается, что привязки будут уничтожены. Видимо, они живут и дальше. Не следует гибко уничтожать все привязки (означающие eventlisteners) от объекта, когда он помечен для GC, потому что последняя ссылка удалена. Это решило бы проблему для меня.

По крайней мере поэтому я думаю, что я все еще новичок в Flex, поэтому любые мысли будут оценены.

-121--237203-

Пакет array используется для указания команды fill для каждой строки в первом столбце:

\begin{tabular}{>{\hfill}p{11cm}|p{11cm}|}

Например:

\documentclass{article}
\usepackage{array}
\begin{document}

\begin{tabular}{>{\hfill}p{5cm}|p{11cm}|}
This is a test & test
\end{tabular}

\begin{tabular}{>{\hfill}p{5cm}|p{11cm}|}
Test & this is a test
\end{tabular}
\end{document}
-121--1742760-

Стандартные библиотеки, поставляемые с MSVC, и библиотеки, поставляемые с типичным компилятором Linux или Unix, достаточно отличаются друг от друга, Также могут быть незначительные диалектические вариации между MSVC и GCC.

Самый простой способ проверить ваши примеры в unix-подобной среде - это установить Cygwin или MSYS в существующем комплекте Windows. Они основаны на GCC и обычных библиотеках с открытым исходным кодом и будут вести себя гораздо больше, как среда компилятора C в unix или linux системе.

  • Cygwin является наиболее «unix like» и основан на cygwin.dll , который является уровнем эмуляции, который эмулирует вызовы unix системы поверх собственного API Win32. Как правило, все, что компилируется на Cygwin, с большой вероятностью компилируется на Linux, так как Cygwin основан на gcc и glibc. Однако собственные API Win32 недоступны для приложений, скомпилированных на Cygwin.

  • MSYS/MinGW32 предназначен для создания собственных приложений Win32 с использованием GCC. Однако большинство стандартных библиотек GNU и других OSS доступны, поэтому они ведут себя скорее как среда Unix, чем VC. Действительно,если вы работаете с кодом, который не использует Win32 или специфичные для Unix API, он, вероятно, будет легче переносить между MinGW32 и Linux, чем между MinGW32 и MSVC.

Хотя установка Linux в вашей лаборатории, вероятно, полезна (используйте проигрыватель VMWare или какой-либо другой гипервизор, если вы не можете получить финансирование для новых серверов), вы можете использовать любую из вышеперечисленных цепочек инструментов, чтобы получить что-то, что, вероятно, будет «достаточно близко» для ваших целей. Вы можете научиться Unix так, как вам кажется, и Cygwin, и MSYS предоставят вам среду, похожую на Unix, которая может дать вам немного нежного введения в то время.

5
ответ дан 3 December 2019 в 01:44
поделиться

Есть штука под названием Анси C . Пока вы кодируете исключительно Ansi C, разницы быть не должно. Однако это скорее академическое предположение.

В реальной жизни я никогда не сталкивался с тем, что какой-либо из моих кодов переносился с Linux на Windows и наоборот без каких-либо изменений. Фактически, эта модификация S (определенно множественное число) превратилась в огромное количество директив препроцессора, таких как #ifdef WINDOWS ... #endif и #ifdef UNIX ... #endif ... даже больше, если использовались некоторые параллельные библиотеки, такие как OPENMPI.

Как вы понимаете, это полностью противоречит читаемому и отлаживаемому коду, но именно это сработало; -)

Кроме того, вы должны учитывать уже упомянутые вещи: UTF-8 иногда выбивает компиляторы Linux. ..

2
ответ дан 3 December 2019 в 01:44
поделиться

Не должно быть разницы между языком программирования C под windows или *nix, потому что язык определен стандартом ISO.

1
ответ дан 3 December 2019 в 01:44
поделиться

Сам язык C является переносимым от Windows к Unix. Но детали операционной системы отличаются, и иногда они вторгаются в ваш код.

Например, Unix системы обычно используют только "\n" для разделения строк в текстовом файле, в то время как большинство инструментов Windows ожидают увидеть "\r\n". Существуют способы справиться с такого рода различиями таким образом, чтобы среда выполнения C обрабатывала их за вас, но если вы не будете осторожны и не будете знать о них, то довольно легко написать код на C, специфичный для ОС.

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

1
ответ дан 3 December 2019 в 01:44
поделиться

Я думаю, что вам крайне важно ознакомиться с unix прямо сейчас.

Отличным способом сделать это является CD Knoppix.

Попробуйте скомпилировать свои программы под Linux с помощью gc, а когда они не работают, отследите проблемы (#include ?) и заставьте их работать. Затем вернитесь к windows, и, скорее всего, программа скомпилируется нормально.

Таким образом, вы обнаружите, что ваши программы становятся чище и лучшим учебным материалом, даже для лабораторных занятий на машинах windows.

1
ответ дан 3 December 2019 в 01:44
поделиться

Частой проблемой является то, что fflush(stdin) не работает на Unix. Это совершенно нормально, поскольку стандарт не определяет, как реализация должна это делать. Решение - использовать что-то вроде этого (не проверено):

do
{
    int c = getchar();
}
while (c != '\n' && c != EOF);

Аналогично, нужно избегать всего, что вызывает неопределенное поведение.

0
ответ дан 3 December 2019 в 01:44
поделиться

Язык тот же, но библиотеки, используемые для получения чего угодно для конкретной платформы сделано другое. Но если вы преподаете C (а не системное программирование), вы легко сможете писать переносимый код. Тот факт, что вы этого не делаете, заставляет меня задаться вопросом о качестве ваших учебных материалов.

10
ответ дан 3 December 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: