今日のコンパイラでは、C99標準はどの程度普遍的にサポートされていますか?GCCでさえ完全にサポートしていないことを理解しています。これは正しいですか?
C99のどの機能が他の機能よりもサポートされていますか?つまり、ほとんどのコンパイラが私を理解していることを確認するために使用できる機能はどれですか?
今日のコンパイラでは、C99標準はどの程度普遍的にサポートされていますか?GCCでさえ完全にサポートしていないことを理解しています。これは正しいですか?
C99のどの機能が他の機能よりもサポートされていますか?つまり、ほとんどのコンパイラが私を理解していることを確認するために使用できる機能はどれですか?
ポータブルCコードを記述したい場合は、C89(古いANSI C標準)で記述することをお勧めします。この標準は、ほとんどのコンパイラでサポートされています。
Intel Cコンパイラは非常に優れたC99サポートを備えており、高速のバイナリを生成します。(0x69に感謝します!)
MSVCはいくつかの新機能をサポートしており、Microsoftは将来のバージョンでサポートを拡大する予定です。
GCCはC99のいくつかの新しいものをサポートしています。彼らはC99機能のステータスに関する表を作成しました。おそらくC99の最も使いやすい機能は可変長配列であり、GCCは現在それをサポートしています。Clang(LLVMのCフロント)は、浮動小数点プラグマを除くほとんどの機能をサポートします。
ウィキペディアには、コンパイラーのC99サポートの素晴らしい要約があるようです。
IntelコンパイラがC99をサポートしていると誰かが言いました。C99 を完全にサポートするComeau C/C++ コンパイラもあります。これらは私が知っている唯一のものです。
十分にサポートされていないために使用しない C99 機能には、次のものがあります。
私が定期的に使用している C99 の機能は、かなりよくサポートされているようです (Microsoft を除く):
stdint.h
snprintf()
- MS には非標準_snprintf()
があり、バッファが常に null で終了するとは限らず、バッファの大きさを示さないという深刻な制限があります。Microsoft の非サポートを回避するために、MinGWのパブリック ドメインstdint.h
(VC6 でも動作するように変更したもの) と、Holger Weissのほぼパブリック ドメインを使用します。snprintf()
Microsoft ではサポートされていませんが、プロジェクトによっては他のコンパイラで引き続き使用される項目には次のものがあります。
_Pragma()
- これにより、プラグマがより使いやすくなりますgccの場合、サポートされているすべての機能を含むテーブルがあります。欠けている最大のものは可変長配列であるように思われます。その他の不足している機能のほとんどは、言語機能ではなくライブラリの問題です。
IBM c コンパイラーは、c99 として呼び出された場合は c99 をサポートしますが、cc または xlc として呼び出された場合はサポートしません。
現在サポートされている機能の詳細については、GNUのC99サポートステータスを参照してください。
Sun Studioは、C99仕様全体をサポートするとされています。使ったことがないので確認できません。
マイクロソフトのコンパイラがC99仕様全体をサポートしているとは思いません。現時点では、C++に重点を置いています。
Clang (LLVM ベースの C および C++ コンパイラ) は、かなり優れた C99 をサポートしています。サポートされていないのは浮動小数点プラグマだけだと思います。
Microsoft は C++ 標準を追跡しているようですが、C99 はサポートしていません。(彼らはいくつかの機能をチェリーピッキングするかもしれませんが、オーバーラップがあるところは C++0x をチェリーピッキングしていると言えます。)
Visual Studio .NET 2003 以降、新しいプロジェクトでは、[C コードを C++ としてコンパイル (/TP)] オプションが既定で有効になっています。