Y a-t-il une différence dans C qui est écrit dans Windows et Unix?
J'enseigne C aussi bien que C ++, mais certains de mes étudiants sont revenus en disant que certains des programmes d'échantillons ne sont pas courus pour eux à UNIX. Unix est étranger pour moi. Malheureusement, aucune expérience avec cela. Tout ce que je sais, c'est de l'épeler. S'il y a des différences, je devrais indiquer à notre ministère d'investir sur des systèmes pour UNIX, comme il n'y a actuellement aucun système UNIX dans notre laboratoire. Je ne veux pas que mes étudiants sentent qu'ils ont été refusés ou gardés loin de quelque chose. P>
9 Réponses :
Il ne devrait y avoir aucune différence entre le langage de programmation C sous Windows ou * Nix, car la langue est spécifiée par la norme ISO. P>
C Syntaxe doit être la même si les compilateurs Windows et Unix adhèrent à la même norme C. On m'a dit que les compilateurs MS ne prennent toujours pas en charge C99 en totalité, bien que les compilateurs UNIX soient à la hauteur, il semble donc que C89 soit un dénominateur commun le plus bas. P>
Cependant, dans Unix World, vous utiliserez généralement Posix SysCalls pour faire des trucs système, tels que IPC, etc. Windows n'est pas un système POSIX, il a donc une API différente pour cela. P>
La langue est la même, mais les bibliothèques utilisées pour obtenir quelque chose de spécifique à la plate-forme sont différentes. Mais si vous enseignez C (et pas de programmation de systèmes), vous devriez facilement pouvoir écrire un code portable. Le fait que vous ne le faites pas, cela me permet de m'interroger sur la qualité de vos supports de formation. P>
Un problème courant est que De même, vous devez éviter tout ce qui provoque un comportement indéfini. P> P> fflush (stdin) code> ne fonctionne pas sur UNIX.
Ce qui est parfaitement normal, car la norme ne définit pas comment la mise en œuvre doit le gérer.
La solution consiste à utiliser quelque chose comme celui-ci (non testé):
Le langage C lui-même est le portable de Windows à UNIX. Mais les détails du système d'exploitation sont différents et parfois ceux qui entrent dans votre code. p>
Par exemple, les systèmes UNIX n'utilisent généralement que "\ n" pour séparer les lignes dans un fichier texte, tandis que la plupart des outils Windows s'attendent à voir "\ r \ n". Il existe des moyens de gérer ce genre de différence d'une manière qui obtient le temps d'exécution C pour le gérer pour vous, mais si vous ne faites pas attention à eux, il est assez facile d'écrire un code C spécifique au système d'exploitation. P>
Je pourrais que vous exécutez une unité unique dans une machine virtuelle et utilisez-la pour tester votre code avant de la partager avec vos étudiants. P>
Je pense que c'est critique que vous vous familiarisez avec UNIX en ce moment. P>
Un excellent moyen de faire ceci est un knoppix cd. p>
Essayez de compiler vos programmes sous Linux à l'aide de GC, et quand ils ne fonctionnent pas, suivez les problèmes (#include De cette façon, vous découvrirez que vos programmes deviennent plus propres et meilleurs enseignants, même pour des exercices de laboratoire sur des machines Windows. P>
Ce type de problèmes apparaissent généralement lorsque vous ne vous tenez pas à la norme nette C et faites des hypothèses sur l'environnement qui pourraient ne pas être vraies. Ceux-ci peuvent inclure la dépendance sur: p>
code>, code>, code> code> .); li>
- comportement non défini (
fflush (stdin) code>, comme le signalait quelqu'un d'autre, il n'est pas nécessaire de faire quoi que ce soit de la norme - c'est en fait un comportement non défini à invoquer fflush code> sur quoi que ce soit Les flux de sortie; en général, les compilateurs plus âgés étaient plus indulgent quant à la violation de règles subtiles telles que le strict aliasing, alors soyez prudent avec des astuces "intelligentes"); li>
- Type de données Taille (le
court code> = 16 bit, int code> = long code> = 32 bits hypothèse ne contient pas partout - 64 bits Linux , par exemple, a 64 bits long code>); li>
- en particulier, la taille du pointeur (
vide * code> n'est pas toujours 32 bits et ne peut pas toujours être déposé en toute sécurité à un non signé long code>); En général, vous devriez faire attention aux conversions et aux comparaisons qui impliquent des pointeurs, et vous devez toujours utiliser les types fournis pour ce type de tâches au lieu de "normal" int code> s (voir en particulier taille_t < / code>, ptrdiff_t code>, uintptr_t code>) li>
- Type de données "Format intérieur" (la norme ne dit pas que
float code> s et double code> s est dans IEEE 754, bien que je n'ai jamais vu des plates-formes le faisant différemment. ); li>
- Fonctions non standard (
__ BEGINTHREAD CODE>, MS Safe Strings Fonctions; de l'autre côté, POSIX / GNU Extensions) LI>
- Extensions du compilateur (
__ inline code>, __ DeclSpec code>, #pragma code> s, ...) et en général tout ce qui commence par un double sens (ou Même avec un seul soulignement, dans d'anciennes implémentations non standard); li>
- Console Codes d'évacuation de la console (ce problème est généralement un problème lorsque vous essayez d'exécuter un code UNIX sous Windows); LI>
- Format de retour de chariot: Dans les chaînes normales, c'est
\ n code> partout, mais quand écrit sur fichier c'est \ n code> sur * Nix, \ r \ n code> sous Windows, \ r code> sur les Mac pré-OSX; La conversion est gérée automatiquement par les flux de fichiers, veillez donc à ouvrir des fichiers en binaire lorsque vous souhaitez réellement écrire des données binaires em> et les laisser en mode texte lorsque vous souhaitez écrire du texte. LI >
ul>
Quoi qu'il en soit, un exemple de programme qui ne compile pas sur * Nix serait utile, nous pourrions vous donner des suggestions de préciser. P>
Les détails du programme sont encore à obtenir. Les étudiants provenaient de notre précédent lot. Ont demandé cela. Turbo C est ce qui est utilisé actuellement. blockquote>
Comme indiqué dans le commentaire, Veuillez déposer Turbo C B> et (si vous l'utilisez) Turbo C ++, de nos jours, ils sont à la fois des morceaux d'historique et ont de nombreuses incompatibilités avec les normes C et C ++ actuelles (et Si je me souviens bien, ils génèrent tous les deux des exécutables 16 bits, cela ne fonctionnera même pas sur des OS 64 bits sur X86_64). P>
Il y a beaucoup d'alternatives gratuites, fonctionnelles et conformes à la normalisation (VC ++ Express, Mingw, Pelles C, Cygwin sous Windows et GCC / G ++ est la norme de facto sur Linux, rivalisée par Clang), vous venez d'avoir choisir un. p>
+1 pour Cygwin et GCC / G ++ sous Windows. Ils vous permettront d'écrire une norme C qui compilera sur n'importe quel * Nix et Mac OSX. Imo c'est la voie à suivre.
Le problème avec eux est que Cygwin a besoin de son exécution et, après tout, il s'agit d'une couche de compatibilité UNIX, je ne le recommanderais donc pas pour des projets indigènes. MINGW, de l'autre côté, sortira des sorties, "normales" Windows Exes. Cependant, au moins quand je l'ai essayé, il semblait optimiser pire que VC ++ et que GCC / G ++ sur Linux, et il ne peut pas utiliser la plate-forme "normale" SDK de Microsoft, et je n'aime pas trop ça. Donc, j'utilise VC ++ sur Windows et G ++ / GCC sur Linux; Il est également utile de compiler votre application avec deux compilateurs différents, vous attrapez immédiatement les problèmes que j'ai décrits ci-dessus.
En fait, Cygwin vous permet de produire des exécutables sans avoir besoin d'une bibliothèque Cygwin, de sorte que le commentaire ne soit pas vraiment terriblement valide. (De la mémoire, c'est la -mingw, -mons ou -Mno-Cygwin ou une autre option le long de ces lignes). Cependant, vous êtes correct que la GCC ne produise pas nécessairement des résultats optimaux que les autres compilateurs - GCC, cependant, fortement portés à de nombreuses architectures et plates-formes, ce qui constitue un avantage substantiel.
Je n'ai pas recherché à ce sujet, mais je pense que cette option reliera simplement statiquement la partie requise de la couche de compatibilité Cygwin dans l'exécutable. Ceci, à mon avis, n'est pas la meilleure option de «réel» développement natif sur Windows, mais il faut être utilisé lorsque vous avez besoin d'une couche de compatibilité POSIX complète.
Les bibliothèques standard qui expédient avec MSVC et celles qui expédient avec un compilateur typique Linux ou UNIX sont suffisamment différentes pour que vous soyez susceptible de rencontrer des problèmes de compatibilité. Il peut également y avoir des variations dialectiques mineures entre MSVC et GCC. P>
Le moyen le plus simple de tester vos exemples dans un environnement de type UNIX serait d'installer Cygwin ou MSYS sur votre kit Windows existant. Celles-ci sont basées sur la GCC et les bibliothèques ouvertes courantes et se comportent beaucoup plus que l'environnement C compilateur C sur un système Unix ou Linux. p>
Cygwin est le plus "Unix comme", et est basé sur un MSYS / MINGW32 est conçu pour la production d'applications Win32 natives utilisant GCC. Cependant, la plupart des bibliothèques standard GNU et d'autres bibliothèques OSS sont disponibles, il se comporte donc davantage comme un environnement UNIX que VC. En fait, si vous travaillez avec du code qui n'utilise pas les API spécifiques WIN32 ou UNIX, il sera probablement porté entre MINGW32 et Linux plus facilement que ce serait entre MINGW32 et MSVC. P> LI>
ul>
Lors de l'installation de Linux installée dans votre laboratoire est probablement une chose utile à faire (utilisez VMware Player ou d'autres hyperviseurs si vous ne pouvez pas obtenir de financement pour de nouveaux serveurs), vous pouvez utiliser l'un ou l'autre deschaines ci-dessus pour obtenir quelque chose qui sera probablement Soyez "assez proche" pour vos besoins. Vous pouvez apprendre UNIX comme tendant votre fantaisie, et que Cygwin et MSYS vous donneront un environnement de type UNIX qui pourrait vous donner un peu d'intro de douceur entre-temps. P> Cygwin.dll code>, qui est une couche d'émulation qui émule des appels de système UNIX en haut de l'API Win32 natif. Généralement, tout ce qui compilerait sur Cygwin est très susceptible de compiler sur Linux, car Cygwin est basé sur GCC et GLIBC. Cependant, les API Win32 natives ne sont pas disponibles pour les applications compilées sur Cygwin. P> Li>
Il y a cette chose appelée ANSI C . Tant que vous codez purement ANSI C, il ne devrait y avoir aucune différence. Cependant, il s'agit d'une hypothèse plutôt académique. p>
Dans la vie réelle, je n'ai jamais rencontré aucun de mes codes portables de Linux à Windows et inversement sans modification. En fait, cette modification Comme vous pouvez l'imaginer, cela est totalement contraire au code lisible et débutable, mais c'est ce qui a été fonctionné; -) p>
En outre, vous devez considérer les choses déjà mentionnées: UTF-8 frappera parfois des compilateurs Linux ... P> #ifdef windows ... #endif code> et
# ifdef Unix ... #endif code> ... Encore plus, si certaines libs parallèles, telles que OpenMpi ont été utilisées. P>
Peut-être que vous faites des hypothèses qui ne sont pas garanties pour être vraies selon la norme C, mais sont vraies dans un environnement Windows. Si vous le pouvez, veuillez poster un petit programme qui montre ce comportement. Vous devez également lire la norme C, ou la version brouillon si vous ne pouvez pas vous permettre de l'acheter: Open-Std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (ceci est pour C99).
Aucun système UNIX dans votre laboratoire? Wow. Quelle est sa force de mettre en place quelques boîtes Linux?
Un exemple simple est
#include code>. Ce fichier n'existe pas dans UNIX. Il y a trop de différences et une liste exhaustive pourrait ne pas être possible de toute façon possible.
La différence est-elle liée au système d'exploitation ou est-elle liée aux compilateurs? Vos exemples de programmes compilent-ils avec GCC ou G ++ sous Windows? Avez-vous essayé Cygwin?
@Alok Quelqu'un suggère d'utiliser CONIO.h doit être retiré et tiré.
@Neil: Je ne suggère pas conio.h. Je ne l'ai jamais utilisé moi-même, car je n'ai pas encore eu besoin de calculs "Opérations d'insertion conique". :-)
Personnellement, je pense que vous faites un service de service à vos élèves si vous ne connaissez pas le tout unix et que vous enseignez C: Windows pourrait être populaire mais loin du seul spectacle en ville. Vous devriez viser à éteindre les programmeurs qui peuvent se développer sur n'importe quelle plate-forme.
Les détails sur le programme sont encore à obtenir. Les étudiants provenaient de notre précédent lot. Ont demandé cela. Turbo C est ce qui est utilisé actuellement.
> Unix est étranger pour moi. ... Tout ce que je sais, c'est de l'épeler. Strictement c'est orthographié Unix ou avec de petites capsules
Oh. Mon. Dieu. Turbo c ... sa dernière version a été publiée en 1989, la même année de la norme C89, il a probablement de nombreuses incompatibilités avec le fonctionnaire ANSI C. Je vous conseille vraiment de vous déplacer dans un compilateur conforme à la normalisation, sont beaucoup de solutions de remplacement gratuites et disponibles. Après tout, vous devez enseigner CS, pas l'archéologie. :) P.s.: S'il vous plaît, ne me dis pas que vous utilisez Turbo C ++ pour enseigner C ++, cela ferait trop mal.
En fait, je serais d'accord avec ça. Turboc est assez ancien; Vous devriez vraiment vous déplacer sur un compilateur plus moderne. Heureusement, il y a de bonnes options gratuites pour les compilateurs C (voir mon affichage ci-dessous) qui fonctionnera assez heureux sur Windows.