C89 (ANSI C) oder C99? / GCC
-
Hallo,
mir stellt sich doch glatt die Frage, ob man nach C98, was der ANSI-C Standard ist, oder C99 programmieren soll.
Immerhin sollen ANSI-C Programme portabel sein. Aber wie siehts mit C99 aus?
Auf der anderen Seite hat C99 paar interessante erweiterungen.Auf pronix.de, wo man das Openbook "C von A bis Z" online lesen kann, steht folgendes zu C99 [12.11.2004]:
Mittlerweile ist der C99-Standard aktuell, der 1999 festgelegt wurde. Wobei ich hier anmerken muss, dass der echte ANSI C99-Standard bei noch keinem Compiler vollständig implementiert ist. Die meisten Compiler basieren noch auf der im Jahre 1995 aktualisierten ISO/IEC-Norm 9899.
C99 nocht nicht komplett implementiert? Stimmt das heute immer noch?
Und seh ich das richtig, dass wenn ich ein Programm nach C99 schreibe, dass es dann nur "portabel" ist, wenn auch der Compiler auf anderen Rechnern/Architekturen C99 beherrscht? Wie ist denn der Stand heute?
Angenommen ich benutze den GCC compiler, dann gebe ich den gewuenschten Standarf mittels
gcc -ansi für ANSI-C gcc -std=c89 für ANSI-C gcc -std=c99 für C99
Oh, habe gerade die GCC doc angeschaut und gelesen
"ISO C99. Note that this standard is not yet fully supported; see http://gcc.gnu.org/gcc-3.4/c99status.html for more information.
gnu89"
Die Programme wären aber portabel?Es saubere Programme nach C99 zu schreiben, könnte man also gcc mit folgenden Optionen starten
gcc -Wall -std=c99 -pedantic bla.c
Das is schon mal einigermaßen gut oder? Fehlt noch ne wichtige Option?
(was ich noch nich ganz verstehe is z.bsp die Option "-W" - unterdrückt die wirklich alle Warnungen?)Ich hoffe ihr könnt mir meine Fragen beantworten
bye
-
vir schrieb:
mir stellt sich doch glatt die Frage, ob man nach C98, was der ANSI-C Standard ist, oder C99 programmieren soll.
Nein, der Standard ist C99, egal ob ISO oder ANSI. Und wenn du portabel programmieren willst, dann tu das nach dem aktuellen Standard.
vir schrieb:
C99 nocht nicht komplett implementiert? Stimmt das heute immer noch?
Keine Ahnung. Da solche Standards (egal ob C oder C++) aber relativ umfangreich sind, ist es auch wahrscheinlich, dass noch nicht alle Compiler diesen vollständig unterstützen.
vir schrieb:
Und seh ich das richtig, dass wenn ich ein Programm nach C99 schreibe, dass es dann nur "portabel" ist, wenn auch der Compiler auf anderen Rechnern/Architekturen C99 beherrscht?
Nein. Portabel ist das, was der Standard vorschreibt. Und wenn ein Compiler das nicht unterstützt, dann ist das sein Problem.
vir schrieb:
was ich noch nich ganz verstehe is z.bsp die Option "-W" - unterdrückt die wirklich alle Warnungen?
Wiederum keine Ahnung. Dazu müsste ich mir die Docs erst näher anschaun, aber das kannst du sicherlich genauso. Und ausserdem solltest generell keine Warnungen unterdrücken, denn sie sind, bis auf wenige Ausnahmen, nichts anderes als compilierbare Fehler.
-
groovemaster schrieb:
Nein. Portabel ist das, was der Standard vorschreibt. Und wenn ein Compiler das nicht unterstützt, dann ist das sein Problem.
Nein, portabel ist dass, was überall geht. Im C++ Standard gibts zB. auch dieses template-export-Feature. Toll, funktioniert nur so ziemlich nirgendwo.
Woran man sich hält, muss man danach entscheiden, wo es überall laufen soll. Gibts eigentlich ausser dem gcc noch andere C-Compiler, die C99 können? Wenn man also will, dass jeder alte C-Compiler das Programm übersetzen können soll, nimmt man lieber den kleinsten gemeinsamen Nenner.
Im Gegensatz zu C89, ist C99 allerdings so viel angenehmer zu benutzen, dass ich mich im Zweifelsfall eher vom gcc abhängig machen würde. Zumal der ohnehin für sehr viele Plattformen verfügbar ist.
-W unterdrückt keine Warnungen sondern aktiviert sie. Keine Warnungen gibts, wenn du es weglässt.
-
DrGreenthumb schrieb:
Nein, portabel ist dass, was überall geht.
Portabilität wird aber vom Standard definiert und gesichert. Punkt. Und was wo geht oder nicht ist dabei unerheblich.
DrGreenthumb schrieb:
Im C++ Standard gibts zB. auch dieses template-export-Feature. Toll, funktioniert nur so ziemlich nirgendwo.
Ich hab in meinem vorherigen Beitrag auch geschrieben, dass es wahrscheinlich ist, dass nicht jeder Compiler den vollen Umfang des Standards unterstützt. Und es soll ja auch Compiler geben, die export unterstützen.
DrGreenthumb schrieb:
Wenn man also will, dass jeder alte C-Compiler das Programm übersetzen können soll, nimmt man lieber den kleinsten gemeinsamen Nenner.
Da muss man sicherlich von Fall zu Fall unterscheiden. Bei Unternehmen, die in ihren Strukturen festgefahren sind, mag das sicherlich zutreffen. Ansonsten bringt diese Mentalität keinen weiter.
-
groovemaster schrieb:
DrGreenthumb schrieb:
Nein, portabel ist dass, was überall geht.
Portabilität wird aber vom Standard definiert und gesichert. Punkt. Und was wo geht oder nicht ist dabei unerheblich.
Eben nicht. Was du schreibst ist völlig realitätsfremd.
Fakt ist, C98 ist wesentlich portabler in der Welt, als C99. Egal obs nen Standard gibt oder nicht.
Und darum gings doch dem Fragesteller.Deswegen muss er selber abschätzen, wie wichtig es ihm ist, dass jeder Compiler sein Programm kompilieren können soll.
-
Einige C99 Erweiterungen lassen sich auch unter C89 verwenden - zumindest syntaktisch
#define bool char
oder
#define restrictsind nicht so tragisch.
Anders sieht es mit featuren aus, die die syntax aendern.
Ich denke VLAs sind recht portabel - da diese schon laenger existieren (wenn auch erst seit 99 im Standard). Ebenso das Definieren von variablen mitten im block. Die Syntax mit den struct, wo man per ".name" direkt die attribute in der initialisierung setzen kann, sollte man aber eher meiden.die neuen Funktionen sollten generell portabel sein - notfalls lassen sie sich ja auch selber implementieren - da wuerde ich mir keine grossen sorgen machen.
weiters pflichte ich DrGreenthumb bei. Mit Ausnahme von
W unterdrückt keine Warnungen sondern aktiviert sie. Keine Warnungen gibts, wenn du es weglässt.
Denn -W aktiviert extra Warnungen - um diese Verwirrung zu beseitigen wurde es auch in -Wextra umbenannt
-
DrGreenthumb schrieb:
Eben nicht. Was du schreibst ist völlig realitätsfremd.
Begründung?
DrGreenthumb schrieb:
Fakt ist, C98 ist wesentlich portabler in der Welt, als C99.
Wiederum, Begründung?
Standards werden ja nicht verabschiedet, damit ein Programmierer mehr Auswahl hat, sondern damit man die Sprache weiterentwickelt. Und da sollte man schon versuchen, seinen Code entsprechend umzustellen. Das soll aber nicht heissen, dass du auch jedes neue Feature nutzen musst.DrGreenthumb schrieb:
Deswegen muss er selber abschätzen, wie wichtig es ihm ist, dass jeder Compiler sein Programm kompilieren können soll.
Ansichtssache. Mir ist es auf jedenfall wichtiger, dass aktuelle Compiler meine Programme übersetzen können, und nicht welche auf dem Stand von anno damals. Und für professionelle Firmen ist dein Argument 'eh keins. Da stehen ganz andere Sachen im Vordergrund.
-
ähm... Die Begründung habe ich doch schon 2x gegeben. C99 wird von weniger Compilern unterstützt. Dadurch *ist* es weniger portabel. Da beißt die Maus keinen Faden ab. Wo ist dein Problem?
Weiterhin habe ich doch selber im ersten Beitrag schon geschrieben, dass ich auch auf C99 setzen würde.
Ansichtssache. Mir ist es auf jedenfall wichtiger, dass aktuelle Compiler meine Programme übersetzen können, und nicht welche auf dem Stand von anno damals.
Schön das du das so siehst. Ändert aber nichts an dem, was ich die ganze Zeit hier sage.
Und für professionelle Firmen ist dein Argument 'eh keins. Da stehen ganz andere Sachen im Vordergrund.
Die müssen wohl selbst wissen, welche Sachen im Vordergrund stehen. Wenn sie zB. Kunden haben, die auf irgendwelchen Uralt-Unixen oder weiß ich was kompilieren wollen, dann ist das ganz sicher von Bedeutung.
-
Es bringt nichts, wenn etwas auf dem Papier super ist - aber in der Realität anders aussieht.
C99 wird nunmal von sehr vielen Compilern nicht unterstützt - somit ist es nicht so portabel wie C89 - auch wenn es auf dem Papier anders aussieht.
-
Programmier in C++
-
Hiya,
danke für die Antworten.
Eins wüsst ich noch gerne, wo findet man denn die erweiterungen von c89 zu c99?
Gibts irgendwo ne übersicht oder so? (wenn möglich auf deutsch?)Wenn ich das richtig sehe, muss man auf http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=29237&ICS1=35&ICS2=60&ICS3=
bezahlen um die Informationen anzusehen?!
-
hier steht ein bischen: http://www.kuro5hin.org/story/2001/2/23/194544/139