2

私はC++の初心者なので、答えが明らかな場合は、おそらく私が探しているものです。私はこのスレッドの2番目の応答を読んでいて、混乱しました。

#include <algorithm>
#include <cassert>

int
main()
{
    using std::swap;
    int a(3), b(5);
    swap(a, b);
    assert(a == 5 && b == 3);
}

「これは定義された関数です。つまり、直接組み込まれていないのはなぜですか」ということはわかりませんがinclude、新しいライブラリは必要ないので、組み込まれていませんか。stdライブラリは自動的にインポートされますか(はいの場合、名前空間が自動的にstdに設定されないのはなぜですか)?

4

3 に答える 3

3

「これは定義された関数です。つまり、直接組み込まれていないのはなぜですか」が、新しいライブラリをインポートする必要がなかったので、組み込まれていませんか?stdライブラリは自動的にインポートされますか(はいの場合、名前空間が自動的にstdに設定されないのはなぜですか)?

つまり、関数はすでに事前に作成されており、ライブラリdefined functionで定義されている可能性が高いですが、おそらくそのように設計されているため、直接組み込まれていません。言語にはコアエッセンシャルのみが含まれ、他のすべてはライブラリに含まれているため、プログラマーは必要なものをインポートできます。

for組み込みでは、通常、またはのようなキーワードwhileです。

いいえ、stdは、プログラマーがカスタム名前空間やstdなど、必要な名前空間を選択できるように設計されているため、自動的にインポートされません。これが自動的に性感染症になるのは悪い例です:

stdを自動的に定義した後、実行したいとしますusing namespace foo;。fooにも関数がcoutある場合、これを実行したいというような大きな問題が発生します。

// code above
cout << "Hello, World" << endl;
// code below

使用する名前空間関数をコンパイラはどのように使用しますか?デフォルトまたはfoo名前空間cout?これを防ぐために、デフォルトの名前空間は設定されておらず、プログラマーに任されています。

お役に立てば幸いです。

于 2012-06-11T18:56:22.707 に答える
3

これは単なる定義済みの関数です。私が言いたかったのは、なぜそれが直接組み込まれていないのかということでした」が、新しいライブラリを含める必要がなかったので、それは組み込まれていませんか?

C ++ライブラリは、定義上、C++の一部です。ただし、これはコア言語の一部ではありません。C++は巨大で巨大な言語です。コンパイラがすぐに言語の隅々まで知っているようにすると、コンパイラは巨大になり、ロードが遅くなります。代わりに、哲学はコアをいくらか小さく保ち、プログラマーに#includingヘッダーファイルによって機能を拡張する機能を与えることです。必要なものを指定します。

名前空間が自動的にstdに設定されないのはなぜですか?

それは本質的にあらゆる種類の非常に一般的な単語をキーワードにするでしょう。使用してはいけない単語のリスト(キーワード、Cのグローバル関数、POSIXまたはMicrosoftによって予約されている単語など)はすでに膨大です。C++標準ライブラリを名前空間stdに配置するのは機能です。これらの名前をすべてグローバル名前空間に配置すると、大きな機能が失われます。

于 2012-06-11T19:10:58.847 に答える
2

コードには、次の行があります。

using std::swap;

したがって、への呼び出しswapは必要ありませんstd::。の場合assert、マクロとして定義されているため、も必要ありませんstd::usingマクロ以外のを使用しなかった場合はstd::、標準C++ライブラリによって提供される関数とオブジェクトを参照するためにを使用する必要があります。

通常、標準C ++ライブラリは、プログラムをコンパイルして実行可能ファイルを作成するときにプログラムにリンクされます。この観点から、あなたはそれを「ビルトイン」と考えるかもしれません。ただし、「組み込み」という用語は通常、コンパイラがその単語swapをキーワードのように扱うことを意味しますが、ここではそうではありません。はヘッダーファイルでswap定義されたテンプレート関数であり、で定義されたマクロです。algorithmassertcassert

名前空間は、ソフトウェアの一部を名前で簡単に分割できるようにするための便利な機能です。したがって、独自の関数を定義したい場合はswap、それを独自の名前空間に入れることができます。

namespace mine {
    template <typename T> void swap (T &a, T &b) { /*...*/ }
}

また、標準や、名前空間なしでスワップを定義したライブラリとは衝突しません。

于 2012-06-11T18:54:07.200 に答える