2016-05-12 14 views
-2

私はC++でのすべてのI/Oが、(C++の標準ライブラリの場合)入出力ストリームまたは(標準ライブラリの場合)標準入出力機能を意味する標準ライブラリヘッダーファイルによって行われていることに疑問を呈しました。ヘッダーファイルを使用せずにC++でI/O操作を実行することは可能ですか?

私の質問は、これはまったく使用せず、OSの標準入力と標準出力と直接インターフェースできますか?

C++では、ヘッダーを一切使用していません。

+0

[関連](http://stackoverflow.com/questions/30942275/how-do-i-can-display-a-string-value-without-using-the-standard-libraries-in-c-la )(それはC用です)。 – Quentin

+0

このために標準ライブラリを使用しないようにする理由は何ですか? – Sean

+0

いいえ、私はちょうど不思議でした。私はおそらく自分でそれをするのに苦労しないだろうが、それが可能かどうかまだ分かっている。 –

答えて

0

実際には、それはLinuxカーネル、それは他のOSカーネルと同じです。システムで何かをするためのコードを書くことは、1つでも#include行なしでも完全に可能です。例えば、Linuxカーネルのkprintf関数はそのような関数の例です。カーネルは自己完結型なので、stlの依存関係はありません。

もちろん、osが画面上のものを置くことに関係するメモリの部分へのアクセスを制限するので、これはユーザ空間では不可能かもしれません。

2

私はあなたの質問を次のように読んでいます:ヘッダファイルを#includeせずにI/O機能にアクセスできますか?他の人が「標準ライブラリヘッダファイルを含めない」と解釈しているのが分かります。

簡単な答えは「いいえ」です。 I/Oはコンパイラーに組み込まれていません。ライブラリによって提供されています。

より複雑な答えは、必要なヘッダーファイルの内容を.cppファイルに直接複製して、標準ライブラリサポートを定義する(またはOSサポートメソッドを定義する)ことができます。これは愚かなことですが、可能です。


のコメントに応答して、歴史的な余談:

C言語は最初、それは多くの理由のために革新的だった出てきました。言語設計者が最も重要な選択肢の1つ(これは現代の言語では当然のことですが)は、コンパイラとそれが受け入れる言語は、機能を失うことなくできるだけ小さくする必要があります。これは、(....ソースを印刷するきれいではありません、または)コンパイラがをコンパイルするに焦点を当てた

、現時点で入手可能な他のコンパイラ(FORTRAN、COBOLなど)に比べCコンパイラ小さな作ら

言語は、何もせずにすべてを可能にすることに焦点を合わせました。デジタルインターフェイス上でビットを操作する埋め込みプログラムを作成していた場合は、コンパイル時または実行時のいずれかで、ラインプリンタでの表示に倍精度数値をフォーマットする機能を使用する必要はありませんでした。

C言語デザイナーのこの決定は何年にもわたって何度も疑問を呈していますが、その決定は常に課題に直面しています。それは当時の正しい選択であり、それでも正しい選択です。Cとその子孫が、他の多くの豊富なコンピューティング環境のほとんどが開発された基盤となる重要な要素です。

+0

私はそうは思わない...なぜなら、I/O機能を持たないのであれば、 'std :: cout << whatever;おそらく私たち自身のコードに、言語のI/Oとどのインタフェースが「」のものと同様の方法でコードを書くかと思います。 –

+1

"I/Oは言語に組み込まれておらず、ライブラリによって提供されています。"標準ライブラリは言語の一部ではありませんが、その仕様はC++仕様の一部です。また、標準C++ライブラリはデフォルトでリンクされているので、ライブラリヘッダ*の複製は移植可能でなければなりません。しかし、それはまだ愚かです。 –

+0

@WarpspeedSCP "コンパイラはどのように理解していますか?" std :: cout << '"適切なヘッダファイルをインクルードしないと答えません。 –

1

必ず、あなたは

#include <unistd.h> 

int main(void) 
{ 
    write(1, "Hello world\n", 12); 
} 

またはオペレーティングシステムを使用してWindowsシステム上で同様のが呼び出す、UNIXシステム上でこれを行うことができます。

+0

ええ、それはそこの他の質問に似ています。ヘッダーを含める必要があります。 –

+1

あなたはおそらく次のようなものを書くことができます: - extern void write(int、const char *、int); ヘッダの代わりに ライブラリを使用したくない場合は、おそらくインラインアセンブリを使用してオペレーティングシステムを呼び出すことができます:P – jcoder

+0

ええ、これはたぶん唯一の方法です。 –

関連する問題