Auf mehreren Compilern, die ich verwendet habe (alle gcc aber verschiedene Versionen) bekomme ich eine C99 mode Fehler für Dinge wie das Deklarieren int i innerhalb des for-Schleifenausdrucks statt davor (wenn ich die std=c99 Möglichkeit). Nach dem Lesen hier Ich verstehe, dass die gcc Optionen -ansi, -std=c89und -std=iso9899:1990 alle werten nach dem ANSI C-Standard aus, aber ich verstehe nicht, warum/ob ich das auswählen sollte c89 Standard gegenüber einem neueren Standard wie c99 (was das neueste ist, nehme ich an).
Außerdem sehe ich mehrere Versionen der iso Typstandards für die C-Sprache, von denen der erste (nach meinem Verständnis) eine direkte Portierung des ANSI-Standards ist. Das kann man mit Sicherheit sagen iso wird ihren Standard für C aktualisieren, aber der ursprüngliche ANSI-Standard für C wird immer derselbe sein?
Bonus-Frage:
Ich kann das eigentlich selbst herausfinden, ich habe mir nur noch nicht die Zeit genommen, es zu tun, also wenn jemand es aus dem Kopf weiß, dann ist das großartig, ansonsten kein Problem, ich werde es später herausfinden 🙂
Ich habe eine relativ neue Auflage des Buches The C Programming Language (ANSI). Mein Buch zeigt immer Schleifen wie diese:
int i;
for(i = 0; i < foo; i++)
aber viele Leute (von denen die meisten mehr Programmiertalent im kleinen Finger haben) schreiben ihre for-Schleifen so:
(int i = 0; i < foo; i++)
Ist es richtig zu sagen, wenn ich die Schleife dann auf die erste Weise schreibe? i sollte auf die gesamte funktion zugreifbar sein, aber wenn ich es dann auf die zweite weise schreibe i ist nur für die for-Schleife zugänglich TROTZDEM mit welchem Standard ich kompiliere? Eine andere Möglichkeit, dieselbe Frage zu stellen, wenn ich mit kompiliere c89 Standard wird die i von beiden for schleifen kann auf die gesamte funktion zugegriffen werden und wenn ich mit der kompiliere c99 Standard wird die i der ersten for-Schleife für die gesamte Funktion zugänglich sein, während die i der zweiten for-Schleife nur über die for-Schleife zugänglich ist?
Was lässt Sie sagen, dass die meisten Leute solche Loops schreiben? Es ist sicherlich kein gültiges C nach dem c89-Standard.
– Karl Norum
24. September 2010 um 2:13 Uhr
@Carl Norum Ich weiß, dass es nicht gültig ist c89 (vorausgesetzt du meinst das mit “das”. int i innerhalb der For-Schleife-Deklaration). Fast jeder, den ich gesehen habe, schreibt seine Loops so. War Ihre Beobachtung anders?
– allgegenwärtig
24. September 2010 um 2:15 Uhr
@typoking: Ich habe noch nie jemanden gesehen, der solche Schleifen in C geschrieben hat. Und ich mache es sicherlich nie selbst, weil ich normalerweise die Nebeneffekte meiner Schleifen ausnutze (mit dem endgültigen Wert von i um zu sagen, wo/warum die Schleife aufgehört hat).
– R.. GitHub HÖR AUF, EIS ZU HELFEN
24. September 2010 um 2:21 Uhr
@typoking: Ich würde mir mehr Sorgen darüber machen, dass es nur sehr wenige Compiler gibt, die tatsächlich C99 vollständig unterstützen. Größtenteils ging es bei C99 nicht darum, Fehler in C89 zu beheben; Es ging darum, der Sprache Funktionalität hinzuzufügen.
– James McNellis
24. September 2010 um 2:32 Uhr
@typoking: Wenn Sie über die in der technischen Berichtigung korrigierten Fehler sprechen, dann vergessen Sie sie. In allen Fällen meinen die Leute, wenn sie über C89 sprechen nach die Korrekturen, nicht das Dokument, das tatsächlich 1989 von ANSI veröffentlicht wurde. gccund jeder andere aktuelle Compiler, sollten die TCs enthalten, obwohl es nicht schadet, die Dokumentation zu überprüfen.
– Steve Jessop
24. September 2010 um 2:49 Uhr
Steve Jessop
Ich verstehe nicht, warum/ob ich den c89-Standard gegenüber einem neueren Standard wie c99 wählen sollte (was der neueste ist, nehme ich an).
Ein paar Gründe:
1) Die C99-Unterstützung von gcc ist nicht ganz vollständig, die C89-Unterstützung hingegen schon. Aus diesem Grund ist C89 (mit GNU-Erweiterungen) die Standardeinstellung. Wenn Sie also ein absoluter Verfechter der Programmierung nach einem Standard mit gcc sind, wählen Sie C89.
2) Der Compiler von Microsoft unterstützt C99 überhaupt nicht. Wenn Sie also portablen C-Code schreiben möchten, ist C89 ein gängiger Standard.
Kann man mit Sicherheit sagen, dass ISO ihren Standard für C aktualisieren wird, aber der ursprüngliche ANSI-Standard für C wird immer derselbe sein?
Nein, ISO C99 wurde auch als ANSI-Standard ratifiziert. Dass der Name “ansi” nur an C89 angehängt wird, ist ein unglücklicher historischer Zufall. Allerdings wird C89 immer C89 bleiben, es ist nur nicht der neueste ANSI-C-Standard.
Ist es richtig zu sagen, wenn ich die Schleife auf die erste Weise schreibe, sollte ich für die gesamte Funktion zugänglich sein, aber wenn ich sie auf die zweite Weise schreibe, dann ist ich nur für die for-Schleife zugänglich, unabhängig davon, mit welchem Standard ich kompiliere?
Sie können es in C89 nicht auf die zweite Art schreiben (dh mit -pedantic sich an die Norm halten), es gibt also kein “egal welche Norm”. Die Versionen von C mit GNU-Erweiterungen sind keine Standards, sie sind “Dialekte” (zumindest nennt sie die Manpage so). In C89 ist die zweite Schleife nicht erlaubt, in C99 schränkt die zweite den Geltungsbereich ein i zur Schleife. Offensichtlich gibt in beiden Fällen die erste Schleife nach i einen größeren Umfang.
Tatsächlich mag gcc die zweite Schleife in C89 nicht, selbst wenn GNU-Erweiterungen aktiviert sind.
ahh, das ist gut zu wissen (dass GNU-Erweiterungen “Dialekte” statt Standards sind).
– allgegenwärtig
24. September 2010 um 2:40 Uhr
Microsoft-Compiler unterstützt jetzt C99 🙂
– Etienne
17. November 2013 um 12:06 Uhr
@Étienne: hast du eine Quelle dafür? Ich weiß, dass MS einige C99-Funktionen hinzugefügt hat, ich wusste nicht, dass sie eine vollständige (oder sogar im Wesentlichen vollständige) Unterstützung angekündigt hatten.
C wurde von ANSI als C89 standardisiert. Es wurde dann von ISO als C90 standardisiert; Es gibt keine technischen Unterschiede zwischen C89 und C90.
C99 ist eine Überarbeitung des C-Standards; Es wurde vom ISO C-Komitee entwickelt und sowohl von ISO als auch von ANSI standardisiert. Sowohl C89 als auch C99 sind ANSI-Standards. Im allgemeinen Sprachgebrauch bezieht sich der Ausdruck “ANSI C” normalerweise auf C89; die K&R 2. Aufl. Buch umfasst nur C89, nicht C99.
Warum sollten Sie sich für eine alte Version von C entscheiden? Nun, es gibt mindestens zwei Gründe. Erstens haben Sie möglicherweise einen Compiler, der C99 nicht unterstützt (z. B. unterstützt Microsoft Visual C++ nur C89). Zweitens gibt es eine Menge Legacy-Code, der Dinge aus C89 verwendet, die in C99 nicht erlaubt sind (Sie können mehr unter der Frage “C99-Abwärtskompatibilität” sehen; die auch auf das C99-Begründungsdokument verweist, das die Unterschiede beschreibt).
Was die “Bonusfrage” betrifft, so können Sie in C89 keine Variable in einer for-Anweisung deklarieren; Sie können in C99. In C89 ist der erste Teil einer for-Anweisung ein Ausdruck.
Vielen Dank für Ihre Antwort, sie hat mir sicherlich geholfen, das Problem zu verstehen, aber ich muss Steve Jessop den Sieg für die Aufschlüsselung und Klärung geben c89 bekannt sein als ANSI ist nur ein “historischer Zufall”.
– allgegenwärtig
24. September 2010 um 13:09 Uhr
Ich habe keine eingehende Erklärung für die C-Standards.
Aber meine Standardeinstellung war, C99 zu verwenden, wenn ich die Möglichkeit dazu hatte. Die Tatsache, dass es sich um den neuesten entwickelten Standard handelt, ist ein Grund (ich habe das irrige Gefühl, dass “neuer besser ist”).
Der Hauptgrund ist, dass ich Variablen in for-Schleifen deklarieren kann.
C99 gültig:
for (int i = 0; i < 100; i++)
{
doSomething();
}
C89, ANSI und älter:
int i;
for (i = 0; i < 100; i++)
{
doSomething();
}
Das C99-Implementierung von gcc ist noch nicht fertig, aber im Programmieralltag einigermaßen brauchbar. Ich habe die Referenz nicht zur Hand, aber für gcc gibt es irgendwo eine Aussage, dass sie an dem Tag, an dem diese Implementierung als beendet gilt, zu C99 (oder nur zu ihrem Dialekt gnu99) wechseln werden.
Die Frage, ob C99-Funktionen verwendet werden oder nicht, ist in einen pragmatischen Teil unterteilt:
für welche Plattformen ich meinen Code kompilieren muss
welche Funktionen würde ich gewinnen (für meinen Geschmack viel Sauberkeit und einfache Programmierung portabel)
und einen emotionalen/ideologischen Teil. Für Letzteres gibt es kein Heilmittel, sondern die Anwendung des Saurierprinzips.
13826600cookie-checkANSI C im Vergleich zu anderen C-Standardsyes
Was lässt Sie sagen, dass die meisten Leute solche Loops schreiben? Es ist sicherlich kein gültiges C nach dem c89-Standard.
– Karl Norum
24. September 2010 um 2:13 Uhr
@Carl Norum Ich weiß, dass es nicht gültig ist
c89
(vorausgesetzt du meinst das mit “das”.int i
innerhalb der For-Schleife-Deklaration). Fast jeder, den ich gesehen habe, schreibt seine Loops so. War Ihre Beobachtung anders?– allgegenwärtig
24. September 2010 um 2:15 Uhr
@typoking: Ich habe noch nie jemanden gesehen, der solche Schleifen in C geschrieben hat. Und ich mache es sicherlich nie selbst, weil ich normalerweise die Nebeneffekte meiner Schleifen ausnutze (mit dem endgültigen Wert von
i
um zu sagen, wo/warum die Schleife aufgehört hat).– R.. GitHub HÖR AUF, EIS ZU HELFEN
24. September 2010 um 2:21 Uhr
@typoking: Ich würde mir mehr Sorgen darüber machen, dass es nur sehr wenige Compiler gibt, die tatsächlich C99 vollständig unterstützen. Größtenteils ging es bei C99 nicht darum, Fehler in C89 zu beheben; Es ging darum, der Sprache Funktionalität hinzuzufügen.
– James McNellis
24. September 2010 um 2:32 Uhr
@typoking: Wenn Sie über die in der technischen Berichtigung korrigierten Fehler sprechen, dann vergessen Sie sie. In allen Fällen meinen die Leute, wenn sie über C89 sprechen nach die Korrekturen, nicht das Dokument, das tatsächlich 1989 von ANSI veröffentlicht wurde.
gcc
und jeder andere aktuelle Compiler, sollten die TCs enthalten, obwohl es nicht schadet, die Dokumentation zu überprüfen.– Steve Jessop
24. September 2010 um 2:49 Uhr