命名空間就是用來區分你使用的這個變量和函數是屬于那一塊的。用來防止不同的人所寫函數和變量,名字相同產生沖突。
在寫c++代碼的時候,經常會使用標準庫中的函數,使用之前我們必須在前面添加一個std::,因為c++標準庫的函數是在命名空間std下定義的。
std::cout << "命名空間" << std::endl;? ? ? ? // 比如輸出數據,必須在前面加std::,否則編譯器不認識
當然,有些人會使用using namespace來簡化這個過程?using namespace std;? ? ? ? ? ? // 告訴編譯器,下面沒有寫命名空間的都默認使用std下的
cout << "命名空間" << endl;? ??
但是,不建議這樣寫,尤其是在全局或者頭文件。
先來說原因:? ?如果你的程序中不止存在一個命名空間,而且這些命名空間中存在相同名字的函數或者變量,你去using會出現問題。
下面,我們自定義兩個命名空間,然后對齊都進行using,內部包含一個同名函數,當我們去調用getAge()的時候會報錯,因為,你同時using的兩個命名空間中都有這個函數,編譯器不知道用哪個,這就是不建議在全局的位置使用到using namespace;
當然,將using namespace放到頭文件中那更是不行的,因為頭文件會到處包含,包含其的文件中可能也存在using namespace,這時候很容易出現下面的問題。所以,一定不要將其放到頭文件中。
namespace Student {int getAge() {}
}namespace Teacher {int getAge() {}
}using namespace Student;
using namespace Teacher;int main() {getAge(); // error
}
?
可以在比較小的一個范圍內部使用using namespace,因為它只會作用在這個較小的作用域內部,是不會影響外界的。?
代碼中這樣寫,相應的using namespace 就不會去影響別的位置的使用,其只會在對應作用域內部有效。
namespace Student {int getAge() {}
}namespace Teacher {int getAge() {}
}void func() {using namespace Teacher;getAge();
}int main() {using namespace Student;getAge();
}
?
?using 還可以只指定namespace的一個函數或者變量,而且命名空間可以取別的名字
namespace Student {using namespace std;int getAge() {}string getName() {} }namespace Teacher {int getAge() {} }void func() {using namespace Teacher;namespace t = Teacher; //給命名空間取別名t::getAge(); // 等價與Teacher::getAge() }int main() {using Student::getName;// getAge(); // errorStudent::getAge();getName(); }