using ディレクティブと include プリプロセッサ ディレクティブは 2 つの異なるものです。Javaの環境変数、またはJava仮想マシンのオプションにinclude
大まかに対応しています。CLASSPATH
-cp
それが行うことは、型をコンパイラに認識させることです。例を含めるだけ<string>
で、次を参照できるようになりますstd::string
。
#include <string>
#include <iostream>
int main() {
std::cout << std::string("hello, i'm a string");
}
現在、ディレクティブの使用import
は Java のようなものです。それらは、名前が表示されるスコープで名前を表示できるようにするため、名前を完全に修飾する必要はもうありません。Java と同様に、使用される名前は、表示される前に認識されている必要があります。
#include <string> // CLASSPATH, or -cp
#include <iostream>
// without import in java you would have to type java.lang.String .
// note it happens that java has a special rule to import java.lang.*
// automatically. but that doesn't happen for other packages
// (java.net for example). But for simplicity, i'm just using java.lang here.
using std::string; // import java.lang.String;
using namespace std; // import java.lang.*;
int main() {
cout << string("hello, i'm a string");
}
ヘッダー ファイルで using ディレクティブを使用するのは悪い習慣です。これは、たまたまそれをインクルードする他のすべてのソース ファイルが、非修飾名ルックアップを使用してそれらの名前を参照することを意味するためです。インポート行が表示されるパッケージにのみ名前を表示する Java とは異なり、C++ では、そのファイルが直接的または間接的に含まれている場合、プログラム全体に影響を与える可能性があります。
実装ファイルであってもグローバル スコープで実行する場合は注意してください。できるだけローカルで使用することをお勧めします。名前空間 std の場合、私はそれを使用しません。私も他の多くの人も、いつもstd::
名前の前に書きます。しかし、たまたまそれを行う場合は、次のようにします。
#include <string>
#include <iostream>
int main() {
using namespace std;
cout << string("hello, i'm a string");
}
名前空間とは何か、なぜ必要なのかについては、Bjarne Stroustrup が 1993 年に発表した C++ 標準に名前空間を追加するための提案を読んでください。それはよく書かれています:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1993/N0262.pdf