C では「std」インクルードなしで何ができるでしょうか? これらは「C」の一部ですか、それとも単なるライブラリですか? 質問する

C では「std」インクルードなしで何ができるでしょうか? これらは「C」の一部ですか、それとも単なるライブラリですか? 質問する

主観的な質問や繰り返しの質問になってしまったら申し訳ありません。検索するのが少し面倒なので、どのような用語を含めればよいかわかりませんでした。

stdio私が知りたいのは、やなどの標準ライブラリを含めない場合、C の基本的な基盤ツール/関数が何であるかということですstdlib

printf()、、などがない場合はどうすればいいでしょうかfopen()?

また、これらのライブラリは技術的には「C」言語の一部ですか、それとも非常に便利で実質的に不可欠なライブラリですか?

ベストアンサー1

C 標準では次のように規定されています (5.1.2.3/5)。

準拠実装の最小要件は次のとおりです。

— シーケンス ポイントでは、以前のアクセスが完了しており、後続のアクセスがまだ発生していないという意味で、揮発性オブジェクトは安定しています。

— プログラム終了時に、ファイルに書き込まれたすべてのデータは、抽象セマンティクスに従ってプログラムを実行した結果と同一でなければなりません。

— インタラクティブデバイスの入力および出力のダイナミクスは、7.19.3 に規定されているとおりに行われなければなりません。

したがって、標準ライブラリ関数がない場合、保証されたファイル アクセスや「対話型デバイス」を使用できないため、プログラムが保証される唯一の動作は、揮発性オブジェクトの値に関係する動作になります。「Pure C」は、標準ライブラリ関数を介した対話のみを提供します。

ただし、純粋な C だけでは十分ではありません。ハードウェアには、読み取りまたは書き込み時に特定の処理を実行する特定のアドレス (SATA または PCI バス、生のビデオ メモリ、シリアル ポート、ビープ音を鳴らすもの、点滅する LED など) がある可能性があるためです。そのため、ハードウェアについて知る標準ライブラリ関数を使用せずに C で多くのことを行うことができます。潜在的には、C 標準ライブラリを実装することもできますが、これには特別な CPU 命令と特別なメモリ アドレスへのアクセスが必要になる可能性があります。

しかし、拡張機能がなく、標準ライブラリ関数が削除された純粋な C では、基本的に、コマンドライン引数を読み取り、何らかの作業を実行し、 からステータス コードを返すこと以外は何もできませんmain。これは軽視すべきことではありません。リソース制限の制約はあるものの、自動変数と静的変数のみでヒープ割り当ては行われません。あまりリッチなプログラミング環境とは言えません。

標準ライブラリは C 言語仕様の一部ですが、どの言語でも、言語そのものとライブラリの間には線引きされる傾向があります。これは概念上の違いですが、最終的には原則としてそれほど重要ではありません。なぜなら、標準ではそれらが一緒になるということになっているからです。非標準のことをする人は誰でも、言語機能とライブラリを簡単に削除できます。どちらにしても、結果は C に準拠した実装にはなりません。

C の「自立型」実装では、I/O を含まない標準インクルードのサブセットのみを実装する必要があることに注意してください。そのため、興味深いことを実行するには、上で説明したように、ハードウェア固有の拡張機能に依存することになります。標準に基づいて「コア言語」と「ライブラリ」を区別したい場合は、それが線引きに適した場所かもしれません。

おすすめ記事