Diskon semantik yang berbeda karena ADL, bagaimana seharusnya saya gunakan secara umum using
, dan mengapa? Apakah ini tergantung situasi (mis. Tajuk yang akan menjadi #include
d vs file sumber yang tidak akan)?
Juga, haruskah saya lebih suka ::std::
atau std::
?
Namespace-level
using namespace
:using namespace std; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Menjadi sepenuhnya eksplisit:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { return std::make_pair(s.begin(), s.end()); }
Namespace-level using-declarations:
using std::pair; using std::string; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Function-local using-declarations:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using std::make_pair; return make_pair(s.begin(), s.end()); }
Fungsi-lokal
using namespace
:std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using namespace std; return make_pair(s.begin(), s.end()); }
Sesuatu yang lain
Ini mengasumsikan pra-C ++ 14, dan dengan demikian tidak ada tipe pengembalian yang digunakan auto
.
::std::
vsstd::
sekalipun.std
tanpa yang kedua sekalipun. Seseorang yang mendefinisikan namespace std meminta masalah (dan mungkin mencari untuk mengambil keuntungan yang kebanyakan orang gunakanstd
dan tidak::std
).Jawaban:
Hindari penggunaan
using
di header, karena itu merusak tujuan ruang nama.Tidak apa-apa untuk menggunakannya dalam file sumber, tapi saya masih akan menghindarinya dalam beberapa kasus (misalnya
using std
).Namun jika Anda mendapatkan ruang nama bersarang, tidak apa-apa:
sumber
using
kata kunci tanpa penjelasan menyeluruh mengapa ruang nama digunakan untuk memulai.using std::cout
dan berteman, tetapi tidak seperticout
itu sudah merupakan nama panjang yang mengerikan.Saat meletakkan pernyataan menggunakan dalam file sumber, TOLONG, cukup tarik hal-hal yang Anda butuhkan. Contohnya:
Masalahnya di sini adalah jika Anda melakukannya
Anda menarik SETIAP HAL SINGLE dari std ke namespace global. Yang mengarah ke pesan kesalahan yang sangat menarik ketika Anda secara tidak sengaja menggunakan nama dalam kode Anda yang cocok dengan yang Anda sama sekali tidak sadari di std. Jika Anda hanya menarik hal-hal yang Anda inginkan, maka Anda tidak akan memiliki masalah itu (atau, lebih tepatnya, programmer berikutnya untuk mengerjakan kode Anda tidak akan memiliki masalah itu).
sumber
using namespace
saja dalam lingkup fungsi, menghindari masalah.Seperti yang ditunjukkan VJovic, jangan gunakan
using
dalam file header.using
dalam file header mempengaruhi unit kompilasi saat ini (file .cpp) dengan cara yang mungkin tidak diharapkan oleh file sumber.using namespace
juga harus dihindari dalam file sumber. Ini membawa setiap simbol ke dalam cakupan yang sama dengan file sumber. Lebih jelas bagi pembaca Anda apa yang Anda lakukan jika Anda menggunakan simbol spesifik dari namespace.sumber
using namespace JoystickModule
di awal file .cpp daripadaJoystickModule::
dilampirkan ke setiap objek di seluruh.using
pernyataan untuk namespace saya sendiri yang saat ini saya kerjakan dan yang lainnya tetap menggunakan namespace.using SomeNameSpace::SomeSymbol
. Ini menghindari memindahkan setiap simbol dari namespace ke dalam cakupan saat ini.Menulis
using
di Header adalah cara terbaik untuk membuat semua jenis bug yang tidak menyenangkan dan tidak mungkin untuk debug . Jangan tidak melakukan hal ini.Menulis
using namespace XYZ
di file sumber sedikit lebih baik, tetapi masih bisa menyebabkan Anda sakit kepala yang tak terhitung jumlahnya. Cara yang aman adalah menentukan apa yang Anda gunakan misalnyausing Foo::Bar
.Katakanlah Anda memiliki Bar.cpp dengan yang berikut:
Fungsi ini berfungsi dengan baik, sampai suatu hari - tampaknya tanpa perubahan kode di kelas yang relevan - perilakunya berubah: Tiba-tiba
currentIndex
sepertinya selalu dimatikan satu per satu . Menggali perubahan terbaru Anda tidak menemukan perubahan bahkan terkait dengan kode jarak jauh.Akhirnya Anda menemukan penyebabnya:
Anda (secara tidak langsung) memasukkan
Foo.h
suatu tempat. Dalam file untuk namespace Foo fungsi baru ditambahkan:Yang merupakan kecocokan yang lebih baik
increment(int)
daripada fungsi Andaincrement(double)
- jadi sekarangFoo::increment()
fungsi dipanggil olehBar::someFunction()
. Aduh.(Dan jika Anda adalah untuk menulis
using
di Header yangusing namespace Foo
mungkin sangat baik menjadi di mana saja di pohon termasuk Anda ...)Jadi ... Jangan menulis apa pun
using
di Header, dan berhati-hatilah dalam menulisusing namespace
file sumber.sumber