2008-09-26 10 views
44

Wie universell wird der C99-Standard in heutigen Compilern unterstützt? Ich verstehe, dass nicht einmal GCC es voll unterstützt. Ist das richtig?Wie universell wird C99 unterstützt?

Welche Features von C99 werden mehr als andere unterstützt, d. H. Welche kann ich verwenden, um ganz sicher zu sein, dass die meisten Compiler mich verstehen werden?

+3

Bibliotheken nicht vergessen. Neben der netten Syntax (wie benannte Struct-Initialisierer) fügt C99 viele nützliche mathematische Bibliotheksfunktionen hinzu, wie zum Beispiel long lrint (double); was die schnelle Rundung bewirkt, muss man sonst hacken (long) (x + 0.5). –

+0

Der Hochleistungs-PGCC-Compiler der Portland Group ist 100% C99-konform. –

Antwort

20

Wenn Sie portable C-Code schreiben möchten, dann würde ich vorschlagen, Sie in C89 (alte ANSI C-Norm) zu schreiben. Dieser Standard wird von den meisten Compilern unterstützt.

Der Intel C Compiler hat very good C99 support und es produziert schnelle Binärdateien. (Danke 0x69!)

MSVC unterstützt some new features und Microsoft planen, den Support in zukünftigen Versionen zu erweitern.

GCC unterstützt einige neue Dinge von C99. Sie erstellten eine Tabelle über die status of C99 features. Das wahrscheinlich am meisten verwendbare Merkmal von C99 ist das Array variabler Länge, und GCC unterstützt es jetzt. Clang (LLVMs C-Frontend) unterstützt die meisten Features außer Fließkomma-Pragmas.

Wikipedia scheint eine nice summary of C99 support der Compiler zu haben.

+0

Mit ANSI C meinst du C89/C90? Weil ANSI C und ISO C auch synonym waren, aber ich verstehe, dass sich jetzt ISO C auf C99 bezieht –

+7

GCC 4.5 schließlich listet Arrays variabler Länge als * Fertig * und nicht * Gebrochen * auf! – u0b34a0f6ae

+0

@ kaizer.se: Danke, dass Sie uns wissen lassen. – KovBal

7

Für gcc gibt es eine table with all supported features. Es scheint, dass das größte Ding, das fehlt, Arrays variabler Länge sind. Die meisten anderen fehlenden Features sind Bibliotheksprobleme und keine Sprachfunktionen.

+0

VLAs werden seit gcc 4.5 vollständig unterstützt. –

3

Details zu den derzeit unterstützten Funktionen finden Sie unter C99 suport status for GNU.

Sun Studio soll die gesamte C99-Spezifikation unterstützen. Ich habe sie nie benutzt, daher kann ich das nicht bestätigen.

Ich glaube nicht, dass der Microsoft-Compiler die C99-Spezifikation in seiner Gesamtheit unterstützt. Sie sind viel mehr auf C++ im Moment konzentriert

2

Microsoft scheint C++ - Standards zu verfolgen, aber keine Unterstützung für C99. (Sie können einige Features auswählen, aber man könnte sagen, dass sie C++ 0x mit einer Überlappung sind.)

Seit Visual Studio .NET 2003 haben neue Projekte den 'C-Code kompilieren als C++ (/ TP) 'Option standardmäßig aktiviert.

16

Jemand erwähnt, dass der Intel-Compiler C99-Unterstützung hat. Es gibt auch die Comeau C/C++ compiler, die C99 vollständig unterstützt. Dies sind die einzigen, die mir bekannt sind.

C99 Funktionen, die ich nicht verwenden, weil sie nicht gut unterstützt werden, gehören:

  • variabler Länge Arrays
  • Makros mit variabler Anzahl von Parametern.

C99 Funktionen, die ich regelmäßig, dass ziemlich gut unterstützt werden, verwenden scheinen (mit Ausnahme von Microsoft):

  • stdint.h
  • snprintf() - MS hat eine Nicht-Standard-_snprintf(), die von nicht ernst Einschränkungen immer Null beendet den Puffer und nicht angibt, wie groß der Puffer sein sollte

Um Microsoft nicht-Unterstützung zu umgehen, verwende ich eine public domain stdint.h from MinGW (die ich modifiziert auch auf VC6 arbeiten) und ein nearly public domain snprintf() from Holger Weiss

Artikel, die nicht von Microsoft unterstützt, aber verwenden immer noch auf anderen Compilern auf dem Projekt abhängig sind:

  • gemischte Erklärungen und Code
  • Inline-Funktionen
  • _Pragma() - das macht pragmas viel mehr nutzbare
+1

VS2010 bietet stdint.h – maep

+0

Ja - VS2010 hinzugefügt einige der C99 Dinge, die in C++ 0x enthalten waren. stdint.h ist eine der wichtigsten Ergänzungen. –

+0

VS2013 unterstützt gemischte Deklarationen und Code und snprintf ist in der nächsten Version von Visual Studio geplant. –

5

Der Compiler IBM c hat c99 supp oder wenn es als c99 aufgerufen wird, aber nicht, wenn es als cc oder xlc aufgerufen wird.

+0

Es muss eine Option wie für gnu mit '-std = c99' geben. – osgx

+2

@osgx Ja, das ist richtig: Sie könnten zum Beispiel die Option -qlanglvl = stdc99 verwenden – frankster

3

Clang (der LLVM basierte C und C++ Compiler) hat ziemlich gute C99 Unterstützung. Ich denke, das einzige, was es nicht unterstützt, sind die Gleitkomma-Pragmas.