использование директив и включение директив препроцессора - это две разные вещи. include
примерно соответствует переменной среды CLASSPATH
Java или опции -cp
виртуальной машины Java.
То, что он делает, делает типы известными компилятору. Например, включение <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");
}
Что такое пространства имен и зачем они вам нужны, пожалуйста, прочитайте предложение, которое Бьярн Страуструп дал в 1993 году, чтобы добавить их в готовящийся стандарт C ++. Хорошо написано:
http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 1993 / N0262.pdf