1

C 標準ライブラリの一部であるC99 標準を読み込みました。stdint.h

C99準拠をテストする場合、次を使用して正しく読みますか?

defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)

が利用可能であることを意味stdint.hしますか?

適切な例: 準拠しているふりをしているが、独自の準拠声明と対立することをC99提供していない環境を考えることはできますか?stdint.h

編集:好奇心旺盛な人のために、問題のシステムはHP Cコンパイラを備えたOpenVMSです(openVMSで提供されるgccではありませんstdint.h)。したがって、これまでに受け取った回答とコメントによると、この実装 (C99 のふりをする) はバグがあると見なす必要があります。詳細: https://groups.google.com/forum/#!topic/comp.os.vms/Bnh3tIOc7bo%5B101-125%5D

4

2 に答える 2

5

はい。

ちなみに、未定義のシンボル0はプリプロセッサ式に展開されるため、次のように記述できます。

#if __STDC_VERSION__ >= 199901L

一方、C99 (または C11) への準拠を主張していない<stdint.h>実装でも、拡張機能としてサポートされる可能性があります。

于 2016-05-09T03:17:52.433 に答える
2

stdint.h準拠する実装が実装を強制される数少ないヘッダーの 1 つです。さまざまなあいまいな組み込みシステムのコンパイラでさえ、これを行う必要があります。規範的なテキスト C11 章 4/6 を参照してください。

適合するホストされた実装は、厳密に適合するプログラムを受け入れるものとします。適合する独立した実装は、ライブラリ条項 (条項 7) で指定された機能の使用が標準ヘッダー<float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>,および<stdnoreturn.h>.

したがって、__STDC_VERSION__ >= 199901L実際にテストすることができ、ヘッダーが利用可能でなければなりません。にはそのような要件がないことに注意してくださいinttypes.h

適切な例: C99 に準拠しているふりをしているが stdint.h を提供していない環境を、独自の準拠ステートメントと矛盾している (したがってバグがある) と見なすことはできますか?

はい。

于 2016-05-09T06:46:12.673 に答える