C-Programm cross-Plattform-Unterschiede auf Windows-und Unix-OS
Ist, gibt es einen Unterschied in C geschrieben ist in Windows-und Unix?
Ich unterrichte C sowie C++, aber einige meiner Schüler haben, kommen zurück, sagen einige der Beispiel-Programme laufen nicht für Sie in Unix. Unix ist Fremd für mich. Leider keine Erfahrung mit Ihr zu löschen. Alles was ich weiß ist, zu buchstabieren es. Wenn es Unterschiede gibt dann sollte ich die Beratung unserer Abteilung zu investieren, Systeme für Unix gibt es derzeit keine Unix-Systemen in unserem Labor. Ich möchte nicht, dass meine Schüler fühlen, dass Sie abgelehnt wurden oder gehalten werden Weg von etwas.
Vielleicht sind Sie machen einige Annahmen, die nicht garantiert sind, um wahr zu sein laut C-standard, aber wahr sind in einer windows-Umgebung. Wenn Sie können, bitte post ein kleines Programm, das zeigt dieses Verhalten. Lesen Sie auch den C-standard, oder der Fassung des Entwurfs, wenn Sie sich nicht leisten können, es zu kaufen: open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf (dies ist für C99).
Keine UNIX-Systemen in Ihrem Labor? Wow. Wie schwer wäre es einrichten, ein paar Linux-Kisten?
Wer was darauf hindeutet Verwendung von conio.h sollte heraus genommen werden und gedreht.
Ich persönlich denke, Sie tun ein Bärendienst für Ihre Studenten, wenn Sie nicht wissen, Unix und Lehre C: Windows mag beliebt sein, aber seine weit von die einzige show in der Stadt. Sie sollten versuchen, sich zu drehen Programmierer, die Sie entwickeln können, auf jeder Plattform.
Oh. Meine. Gott. Turbo C... seiner letzten version wurde veröffentlicht im Jahr 1989, im gleichen Jahr der C89-standard, so dass es wahrscheinlich viele Inkompatibilitäten mit der offiziellen ANSI-C. I wirklich beraten Sie zu bewegen, auf eine neuere, standard-konforme compiler, es gibt eine Menge Kostenlose und gute alternativen zur Verfügung. Nachdem alle, die Sie haben zu lehren, CS, nicht Archäologie. 🙂 P. S.: bitte, Sag mir nicht, dass du mit Turbo C++ zu unterrichten, C++, es würde zu viel Schaden.
Keine UNIX-Systemen in Ihrem Labor? Wow. Wie schwer wäre es einrichten, ein paar Linux-Kisten?
Wer was darauf hindeutet Verwendung von conio.h sollte heraus genommen werden und gedreht.
Ich persönlich denke, Sie tun ein Bärendienst für Ihre Studenten, wenn Sie nicht wissen, Unix und Lehre C: Windows mag beliebt sein, aber seine weit von die einzige show in der Stadt. Sie sollten versuchen, sich zu drehen Programmierer, die Sie entwickeln können, auf jeder Plattform.
Oh. Meine. Gott. Turbo C... seiner letzten version wurde veröffentlicht im Jahr 1989, im gleichen Jahr der C89-standard, so dass es wahrscheinlich viele Inkompatibilitäten mit der offiziellen ANSI-C. I wirklich beraten Sie zu bewegen, auf eine neuere, standard-konforme compiler, es gibt eine Menge Kostenlose und gute alternativen zur Verfügung. Nachdem alle, die Sie haben zu lehren, CS, nicht Archäologie. 🙂 P. S.: bitte, Sag mir nicht, dass du mit Turbo C++ zu unterrichten, C++, es würde zu viel Schaden.
InformationsquelleAutor zapping | 2010-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Art von Problemen in der Regel angezeigt, wenn Sie don ' T-stick auf die nackten C-standard, und machen Annahmen über die Umwelt, das darf doch nicht wahr sein. Dazu kann gehören, Vertrauen auf:
<conio.h>
,<windows.h>
,<unistd.h>
, ...);fflush(stdin)
, als jemand anderes berichtet, ist nicht erforderlich, etwas zu tun, indem Sie die standard - es ist eigentlich nicht definiertes Verhalten aufrufenfflush
auf nichts, aber die Ausgangs-streams; im Allgemeinen, ältere Compiler wurden mehr nachsichtig über die Verletzung der einige subtile Regeln, wie strict-aliasing, also seien Sie vorsichtig mit "clever" Zeiger tricks);short
=16 bit,int
=long
=32 bit-Annahme nicht halten überall - 64-bit-Linux, zum Beispiel, hat die 64-bit -long
);void *
ist nicht immer 32 bit, und kann nicht immer gegossen sicher zu einemunsigned long
); im Allgemeinen sollten Sie vorsichtig sein, mit Umbauten und Vergleiche, beinhalten Hinweise, und Sie sollten benutzen Sie immer die vorgesehenen Arten für diese Art von Aufgaben anstelle von "normalen"int
s (siehe insbesonderesize_t
,ptrdiff_t
,uintptr_t
)float
s unddouble
s sind im IEEE-754, obwohl ich Sie noch nie gesehen habe-Plattformen macht es anders);__beginthread
, MS sicher Zeichenfolgen-Funktionen; auf der anderen Seite, POSIX/GNU-Erweiterungen)__inline
,__declspec
,#pragma
s, ...) und im Allgemeinen alles, was beginnt mit doppelten Unterstrich (oder auch mit einem einzelnen Unterstrich beginnen, in alten, nicht standardmäßige Implementierungen);\n
überall, aber beim schreiben auf Datei es ist\n
auf *NIX\r\n
auf Windows\r
auf pre-OSX-Macs; ist die Konvertierung verarbeitet automatisch über das Datei-streams, also seien Sie vorsichtig beim öffnen von Dateien im Binär -, wenn Sie wirklich wollen, zu schreiben binäre Daten, und lassen Sie Sie im text-Modus, wenn Sie wollen, text zu schreiben.Jedenfalls ein Beispiel des Programms, die sich nicht kompilieren auf *NIX-wäre hilfreich, könnten wir Ihnen preciser Vorschläge.
Wie gesagt in dem Kommentar, bitte schreiben Sie Turbo C und (wenn Sie es) Turbo C++, heute sind Sie beide Stücke der Geschichte und haben viele Inkompatibilitäten mit der aktuellen C-und C++ - standards (und wenn ich mich gut daran erinnern, dass Sie beide erzeugen 16-bit-Programme, die nicht laufen auch auf 64-bit-Betriebssysteme auf x86_64).
Es gibt eine Menge von frei -, Arbeits-und standard-konforme alternativen (VC++ Express, MinGW, Pelles C, CygWin auf Windows, und der gcc/g++ ist der de-facto-standard auf Linux, nur noch von clang), Sie müssen nur wählen Sie ein.
Das problem mit Ihnen ist, dass CygWin braucht seine Laufzeit, und schließlich ist es ein UNIX-Kompatibilität Schicht, so dass ich würde nicht empfehlen es für einheimische Projekte. MinGW, auf der anderen Seite, Ausgänge native "normalen" Windows-EXEs. Jedoch, zumindest, wenn ich es versuchte, schien es zu optimieren schlechter als VC++ und gcc/g++ auf Linux, und es kann nicht in der "normalen" Plattform-SDK von Microsoft, und ich möchte nicht das dies zu viel. Also, ich benutze VC++ auf Windows-und g++/gcc auf Linux; es ist auch nützlich, um kompilieren Sie Ihre Anwendung mit zwei verschiedenen Compilern, Sie fangen sofort die Probleme die ich oben beschrieben habe.
Eigentlich cygwin ermöglicht das erstellen ausführbare Dateien, ohne dass Sie eine cygwin-Bibliothek, so dieser Kommentar ist nicht wirklich schrecklich gültig. (Aus dem Gedächtnis, es ist die -mingw, -msys-oder -mno-cygwin oder einige andere option, die entlang dieser Linien). Sie sind richtig, jedoch, dass der gcc nicht zwangsweise so optimale Ergebnisse wie andere Compiler gcc, jedoch stark Portierung auf vielen Architekturen und Plattformen, die einen wesentlichen Vorteil.
Ich habe nicht die Forschung, aber ich denke, dass diese option einfach statisch link das benötigte Teil des cygwin Verträglichkeit layer in die ausführbare Datei. Das ist, meiner Meinung nach, nicht die beste option zu tun, um "echte" native Entwicklung auf windows, aber es sollte verwendet werden, wenn Sie brauchen eine volle POSIX-Kompatibilität Schicht.
InformationsquelleAutor Matteo Italia
Die Sprache ist die gleiche, aber die Bibliotheken verwendet, um alles zu erhalten-Plattform-spezifisch erfolgt, sind Verschieden. Aber wenn Sie lehren, C (und nicht Systeme Programmierung) sollten Sie leicht in der Lage zu schreiben portablen code. Die Tatsache, dass Sie nicht tun, so Frage ich mich, über die Qualität Ihrer Ausbildung Materialien.
InformationsquelleAutor
Den standard-Bibliotheken, die ein Schiff mit MSVC und diejenigen, die Schiff mit einer typischen Linux-oder Unix-compiler sind unterschiedlich genug, dass Sie wahrscheinlich zu begegnen Kompatibilitätsprobleme. Es kann auch kleinere Dialektik Unterschiede zwischen MSVC und GCC.
Die einfachste Möglichkeit zu testen, Ihre Beispiele in einer unix-artigen Umgebung zu installieren wäre Cygwin oder MSYS auf Ihrem vorhandenen Windows-kit. Diese basieren auf GCC und gemeinsame open-source-Bibliotheken und verhält sich viel mehr wie die C-compiler-Umgebung auf einem unix-oder linux-system.
Cygwin ist die 'unix-like', und basiert auf einer
cygwin.dll
, die eine emulation layer) emuliert unix-system-calls auf der Oberseite der nativen Win32-API. In der Regel alles, was zusammenstellen würde auf Cygwin ist sehr wahrscheinlich, um zu kompilieren auf Linux, Cygwin basiert auf gcc und glibc. Jedoch, native Win32-APIs, die nicht verfügbar sind kompilierte Anwendungen, die auf Cygwin.MSYS/MinGW32 ist konzipiert für die Herstellung von nativen Win32-Anwendungen mit GCC. Allerdings, die meisten von den standard-GNU-und andere OSS-Bibliotheken verfügbar sind, so verhält es sich mehr wie eine unix-Umgebung als VC hat. In der Tat, wenn Sie arbeiten mit code, der nicht mit Win32 oder unix-spezifische APIs wird es wohl port zwischen MinGW32-und Linux-einfacher als es zwischen MinGW32 und MSVC.
Während sich Linux installiert haben, in Ihrem Labor ist wohl eine nützliche Sache zu tun (mit VMWare player oder eine andere hypervisor-wenn Sie nicht bekommen kann die Finanzierung für neue Server) Sie können eine der oben genannten toolchains um etwas zu bekommen, das wird es wohl sein 'nahe genug' für Ihre Zwecke. Sie können lernen, unix-wie Ihr Lust und Laune, und beide Cygwin und MSYS geben Sie eine unix-ähnliche Umgebung, die geben könnte Sie ein wenig von einem sanften intro in der Zwischenzeit.
InformationsquelleAutor ConcernedOfTunbridgeWells
C-syntax muss die gleiche sein, wenn beide Windows-und Unix-Compiler halten sich an die gleichen C-standard. Mir wurde gesagt, dass MS Compilern noch nicht unterstützt C99 vollständig, obwohl Unix-Compiler zu beschleunigen, so scheint es, C89 ist ein kleinster gemeinsamer Nenner.
Jedoch in der Unix-Welt, die Sie in der Regel verwenden Sie POSIX-syscalls zu tun system Sachen, wie z.B. IPC, etc. Windows nicht POSIX-system so, dass es hat verschiedene API.
InformationsquelleAutor qrdl
Gibt es dieses Ding namens Ansi-C. Solange Sie den code rein Ansi C, sollte es keinen Unterschied. Das ist allerdings eine eher Akademische Annahme.
Im realen Leben, ich kenne keine von meinen codes portable von Linux zu Windows und Umgekehrt, ohne jegliche änderung. Eigentlich ist diese änderungS (eindeutig plural) verwandelt sich in eine riesige amout der pre-Prozessor Richtlinien, wie
#ifdef WINDOWS ... #endif
und#ifdef UNIX ... #endif
... noch mehr, wenn einige parallel-Bibliotheken wie OPENMPI verwendet wurden.Als Sie sich vorstellen können, ist dies völlig im Gegensatz zu lesbaren und debugable code, aber das war, was funktioniert hat 😉
Neben, Sie haben, Dinge zu betrachten, die bereits erwähnt: UTF-8 wird manchmal knock-out linux-Compiler...
InformationsquelleAutor S.Tayefeh
Sollte es keinen Unterschied zwischen der Programmiersprache C unter windows oder *nix,denn die Sprache ist gemäß ISO-standard.
InformationsquelleAutor Jichao
Die Sprache C selbst ist die portable von Windows auf Unix. Aber Betriebssystem details sind unterschiedlich und manchmal werden diese dringen in Ihren code.
Zum Beispiel Unix-Systeme verwenden in der Regel nur "\n" auf separaten Zeilen in eine Textdatei, während die meisten Windows-tools erwarten, um zu sehen, "\r\n". Es gibt Möglichkeiten zum Umgang mit dieser Art von Unterschied in einer Weise, bekommt die C-runtime zu behandeln, es für Sie aber wenn Sie nicht vorsichtig sind, werden Sie über Sie wissen, es ist ziemlich einfach zu schreiben OS-spezifischen C-code.
Konnte ich, dass Sie ausführen, ein Unix in einer Virtuellen Maschine vor und verwenden Sie, um den code zu testen, bevor Sie teilen Sie es mit Ihren Studenten.
InformationsquelleAutor John Knoeller
Ich denke, seine wichtig, dass Sie sich vertraut mit unix-rechten jetzt.
Ein ausgezeichneter Weg, dies zu tun ist mit einem Knoppix CD.
Versuchen, kompilieren Sie Ihre Programme unter Linux mittels gc, und wenn Sie nicht arbeiten, die Spur der Probleme (#include <windows>?) und damit es funktioniert. Dann kehren Sie zu windows zurück, und es werden wahrscheinlich kompilieren ok.
In diesem way, Sie werden entdecken, Ihre Programme werden besser und sauberer Lehrmaterial, auch für lab-übungen auf windows-Rechnern.
InformationsquelleAutor Will
Ein häufiges problem ist, dass
fflush(stdin)
funktioniert nicht auf Unix.Das ist vollkommen normal, da der standard nicht zu definieren, wie die Umsetzung behandeln soll.
Die Lösung: verwenden Sie so etwas (ungetestet):
Ebenso müssen Sie alles vermeiden, was zu undefiniertem Verhalten.
InformationsquelleAutor Bastien Léonard