HeadlinesBriefing HeadlinesBriefing.com

あなたの C は標準 C ではない

Hacker News •
×

これは、標準規格に書かれている C と、glibc や musl を使って gcc や clang を利用している人々の現実の C との間の非互換性の、不完全なリストです。

gcc と clang はデフォルトで asm キーワードを拡張機能として認識します。標準 C では asm は予約されていない有効な識別子であるため、標準に準拠したコードでもデフォルト設定ではコンパイルできない場合があります。コンパイラはデフォルトでは準拠しておらず、標準は C++ のように asm を予約語にすることもできましたが、そうはなっていません。

標準では、<fenv.h> の fesetround によって行われた実行時の丸めモードの変更を FLT_ROUNDS が反映することが要求されています。しかし gcc は、実行時の丸めモードに関係なく FLT_ROUNDS を常に 1(最近接値への丸め)として定義します。clang は __builtin_flt_rounds() という組み込み関数を提供していますが、gcc にはありません。

C 標準は、算術動作を制御するための浮動小数点プラグマを規定しています。これらは C99 と C23 で追加されました。C99 から 27 年以上経った今でも、gcc はこれらすべてを何もしない命令として無視しており、clang は C99 のプラグマのみをサポートしています。一部の機能はコマンドラインフラグで再現できますが、それらは個々の関数やブロックではなく、翻訳単位全体に適用されます。

標準では、関数の戻り値型の修飾子は破棄されることが要求されています。しかし clang はこれらを意味のあるものとして扱うため、int f(); と const int f(); を両方宣言すると、本来は同一であるべき二つの宣言であるにもかかわらず、型の衝突エラーが発生します。

出典: Hacker News · 要約:HeadlinesBriefing