C99はどの程度サポートされていますか?
-
02-07-2019 - |
質問
現在のコンパイラでサポートされているC99標準はどれくらい一般的ですか? GCCでさえ完全にサポートしていないことを理解しています。これは正しいですか?
C99のどの機能が他の機能よりも多くサポートされていますか?つまり、ほとんどのコンパイラーが私を理解していると確信するためにどの機能を使用できますか?
解決
移植可能なCコードを作成する場合は、C89(古いANSI C標準)で作成することをお勧めします。この標準は、ほとんどのコンパイラでサポートされています。
Intel Cコンパイラには非常に良いC99サポート。高速バイナリを生成します。 ( 0x69 に感謝!)
MSVCはいくつかの新機能およびマイクロソフトは、将来のバージョンでサポートを拡大する予定です。
GCCは、C99のいくつかの新しい機能をサポートしています。彼らは、 C99機能のステータスに関する表を作成しました。おそらくC99の最も有用な機能は可変長配列であり、GCCは現在それをサポートしています。 Clang (LLVMのCフロント)は、浮動小数点プラグマを除くほとんどの機能をサポートしています。
ウィキペディアには、コンパイラの C99サポートの概要があるようです。 p>
他のヒント
IntelコンパイラはC99をサポートしていると誰かが言及しました。 C99を完全にサポートする Comeau C / C ++コンパイラもあります。これらは私が知っている唯一のものです。
十分にサポートされていないため使用しないC99機能には次のものがあります。
- 可変長配列
- パラメータ数が可変のマクロ。
私が定期的に使用しているC99機能は、かなりよくサポートされているようです(Microsoftを除く):
-
stdint.h
-
snprintf()
-MSには非標準の_snprintf()
があり、バッファを常にnullで終了させるわけではなく、バッファの大きさを示さないという重大な制限があります
Microsoftの非サポートを回避するには、パブリックドメイン stdint.h を使用しますMinGWからのコード> a(VC6でも動作するように修正したもの)およびほぼ公開Holger Weissのドメイン
snprintf()
Microsoftによってサポートされていないが、プロジェクトに応じて他のコンパイラで引き続き使用するアイテムには、次のものがあります。
- 宣言とコードの混合
- インライン関数
-
_Pragma()
-これにより、プラグマがさらに使いやすくなります
gccには、サポートされているすべての機能を備えたテーブルがあります。欠けている最大のものは可変長配列であるようです。その他の不足している機能のほとんどは、言語機能ではなくライブラリの問題です。
IBM cコンパイラは、c99として呼び出されたときはc99をサポートしますが、ccまたはxlcとして呼び出されたときはサポートしません。
現在サポートされている機能の詳細については、 C99 GNUのサポート状況をご覧ください。
Sun Studio はC99仕様全体をサポートします。使用したことがないので確認できません。
MicrosoftコンパイラがC99仕様を完全にサポートしているとは思わない。現時点では、はるかにC ++に焦点を当てています
Clang(LLVMベースのCおよびC ++コンパイラー)は、かなり優れたC99サポートを備えています。サポートされていないのは浮動小数点プラグマだけだと思います。
MicrosoftはC ++標準を追跡しているようですが、C99をサポートしていません。 (それらはいくつかの機能を選りすぐりますが、重複があるC ++ 0xを選りすぐりと言うことができます。)
Visual Studio .NET 2003の時点で、新しいプロジェクトには「CコードをC ++としてコンパイル(/ TP)」オプションがデフォルトで有効になっています。