Ketika saya membaca standar Google, Anda tidak dapat menggunakan using namespace foo;
arahan di mana pun. Arahan ini membawa semua yang dinyatakan dalam namespace dan merupakan penyebab umum tabrakan dan perilaku tak terduga. Orang lain telah mengutip yang sangat umum: Anda memiliki metode max atau min Anda sendiri di suatu tempat dan bertabrakan dalam file src di mana seseorang menyertakan header dengan metode Anda dan kemudian berkatausing namespace std;
Di tempat-tempat tertentu, diizinkan untuk menggunakan deklarasi penggunaan, yang merupakan bentuk using ::foo::bar;
Orang-orang suka menggunakan arahan dalam kode mereka karena menghemat banyak pengetikan, tetapi berisiko. Jika Anda memiliki file dengan banyak pernyataan cout, saya bisa mengerti tidak ingin harus mengetik std :: cout seratus kali, tetapi Anda bisa mengatakan menggunakan :: std :: cout. Saya memperlakukan deklarasi variabel seperti ini: lingkup di mana mereka dibutuhkan. Jika satu fungsi dalam file 10 perlu menulis output, jangan mendeklarasikan cara cout di atas, taruh di fungsi yang melakukan output aktual.
#include <ostream>
//using namespace std; // NO!
//using ::std::cout; // less bad than using namespace, but I prefer to scope it
int main(int argc, char** argv)
{
int rc = do_some_stuff(argc, argv);
using ::std::endl;
if (rc) { // print the success report
using ::std::cout;
cout << "The test run completed. The return code was " << rc << '.' << endl;
} else {
using ::std::cerr;
cerr << "Unable to complete the test run." << endl;
}
return 0 == rc;
}
Itu sedikit ekstrem dengan hanya beberapa baris melakukan output, tetapi Anda mendapatkan idenya.
Hal lain yang bisa dilakukan adalah alias atau mengetik untuk meminimalkan pengetikan. Saya tidak menemukan std :: apa pun menjadi seburuk itu, tetapi kami memiliki seperangkat sumber besar dengan beberapa lusin modul dan terkadang kami harus menulis kode seperti console_gui::command_window::append("text")
. Itu membosankan setelah beberapa saat dan menyebabkan banyak antrian panjang. Saya semua untuk sesuatu seperti
typedef console_gui::command_window cw;
cw::append("text");
selama alias dilakukan dalam lingkup lokal dan menjaga konteks yang cukup untuk membuat kode dapat dibaca.
std::endl
untuk flush eksplisit padastdout
/stderr
biasanya cukup berlebihan, aliran tersebut terikatstdout
/stderr
toh. Bahkan sedikit memperlambatnya.Ini karena: 1) ia mengalahkan seluruh tujuan ruang nama, yaitu untuk mengurangi tabrakan nama; 2) itu membuat tersedia untuk namespace global yang seluruh namespace ditentukan dengan menggunakan direktif.
Misalnya, jika Anda memasukkan dan menetapkan fungsi maks () Anda sendiri, ia akan bertabrakan dengan std :: max ().
http://en.cppreference.com/w/cpp/algorithm/max
Preferensi adalah menggunakan std :: member_you_wish_to_use karena secara eksplisit menyatakan namespace yang akan digunakan.
sumber
std::max()
awalan ruang nama. Atau saya salah?using
arahan karena dalam hal ini akan merusak fungsi max () Anda jika Anda telah mendefinisikan satu dan memasukkan <algorithm>. Ini adalah kasus sederhana tetapi Anda tidak pernah tahu apa yang mungkin Anda hancurkan. Anda harus mengetahui seluruh perpustakaan untuk memastikan Anda tidak merusaknya tetapi Anda tidak bisa tahu apakah kode Anda akan rusak (yaitu tabrakan nama) di masa depan.Mengutip tautan yang Anda berikan:
Gaya Google melarang Anda menggunakan mengimpor ruang nama dalam konteks global, tetapi memungkinkan untuk melakukannya dalam ruang lokal.
Di mana-mana di mana menggunakan deklarasi hanya memengaruhi bagian kode yang terbatas dan terlihat jelas itu sangat dapat diterima.
Saat Anda mencemari konteks global, kode yang tidak terkait akan terpengaruh (secara implisit menggunakan tajuk Anda). Tidak ada yang terjadi ketika Anda melakukannya dalam konteks lokal.
sumber
Anda melakukannya. Kekecewaan hanya berlaku untuk
using namespace
arahan (yang biasanya disebutabusing namespace
, tidak sepenuhnya lucu). Sangat disarankan agar Anda menggunakan nama fungsi atau objek yang sepenuhnya memenuhi syarat, sepertistd::cout
.sumber
Meskipun pertanyaannya sudah memiliki jawaban yang bermanfaat, satu detail tampaknya terlalu pendek.
Kebanyakan programmer pada awalnya agak bingung dengan
using
kata kunci dan deskripsinamespace
penggunaan, bahkan jika mereka mencoba mempelajarinya dengan mencari referensi, karena deklarasi dan arahan berbunyi agak setara, keduanya kata-kata panjang yang relatif abstrak dimulai dengan d .Pengidentifikasi dalam ruang nama dapat diakses dengan secara eksplisit memberi nama ruang nama:
ini mungkin lebih banyak kunci untuk diketik. Tetapi juga dapat mengurangi signifikansi kode Anda, jika sebagian besar pengidentifikasi diawali dengan cara yang sama. Kata
using
kunci membantu untuk mencegah kerugian namespace ini. Karenausing
berfungsi pada level kompiler (ini bukan makro), efeknya berlaku untuk seluruh cakupan yang digunakan. Karena itulah gaya Google membatasi penggunaannya untuk cakupan yang didefinisikan dengan baik, yaitu kelas dalam file header atau fungsi dalam file cpp.... tentu saja ada perbedaan di antara keduanya menggunakan deklarasi
dan menggunakan arahan
Jika digunakan dalam lingkup besar, yang terakhir menyebabkan kebingungan lebih banyak .
sumber
Ini dia:
Dengan menulis seperti ini, kami menghindari ADL rawan kesalahan bersama dengan menggunakan arahan dan deklarasi.
Ini dimaksudkan sebagai jawaban sarkastik. :-D
Saya dengan Herb Sutter melalui Google untuk yang satu ini. Dari C ++ Standar Pengodean:
Anda dapat terobsesi tentang potensi konflik namespace yang mungkin tidak akan pernah terwujud dan mungkin tidak akan sulit untuk diperbaiki dalam peristiwa yang jarang terjadi secara astronomis dengan secara hati-hati menghindari
using
arahan dan secara eksplisit menentukan setiap hal yang Anda gunakan (turun ke operator) denganusing
deklarasi, atau langsung saja dan mulaiusing namespace std
. Saya merekomendasikan yang terakhir dari sudut pandang produktivitas.Sebaliknya jika Anda bertanya kepada saya, dan saya percaya Sutter di atas setuju.
Sekarang, selama karir saya, saya telah menemukan sekitar 3 konflik namespace total sebagai akibat langsung dari
using
arahan dalam basis kode yang mencakup puluhan juta LOC. Namun, dalam semua 3 kasus, mereka berada dalam file sumber yang membentang lebih dari 50.000 baris kode warisan, awalnya ditulis dalam C dan kemudian dibastardisasi ke C ++, melakukan daftar eklektik besar fungsi yang berbeda, termasuk header dari selusin perpustakaan yang berbeda, dan memiliki daftar epik#includes
yang membentang di atas halaman. Terlepas dari kekacauan epik, mereka tidak terlalu sulit untuk diperbaiki karena mereka menyebabkan kesalahan build pada OSX (satu OS di mana kode gagal dibangun), bukan bug runtime. Jangan mengatur kode Anda dengan cara mengerikan ini dan Anda harus baik-baik saja.Yang mengatakan, menghindari baik
using
arahan dan deklarasi di file header. Itu hanya terbelakang. Tetapi untuk file sumber, dan terutama file yang tidak memiliki halaman penuh dengan#include
arahan, saya katakan jangan khawatirkan jika Anda tidak bekerja untuk Google.sumber