Apakah ada perbedaan antara membungkus konten file header dan cpp dalam namespace atau hanya membungkus konten header dan kemudian melakukan penggunaan namespace di file cpp?
Yang saya maksud dengan perbedaan adalah hukuman kinerja apa pun atau semantik yang sedikit berbeda yang dapat menyebabkan masalah atau apa pun yang perlu saya waspadai.
Contoh:
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
namespace X
{
void Foo::TheFunc()
{
return;
}
}
VS
// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}
// cpp
using namespace X;
{
void Foo::TheFunc()
{
return;
}
}
Jika tidak ada perbedaan apa bentuk yang disukai dan mengapa?
sumber
Tidak ada penalti performa, karena hasilnya bisa saja sama, tetapi memasukkan Anda
Foo
ke dalam namespace secara implisit menimbulkan ambiguitas jika Anda memilikiFoo
s di namespace yang berbeda. Anda memang bisa mendapatkan kode fubar Anda. Saya akan merekomendasikan menghindari penggunaanusing
untuk tujuan ini.Dan Anda tersesat
{
setelahusing namespace
;-)sumber
}
di bagian paling akhir. Namun, saya akan menyebut sepasang kawat gigi itu berlebihan;)Jika yang kedua dikompilasi juga, seharusnya tidak ada perbedaan. Namespaces diproses dalam waktu kompilasi dan tidak boleh memengaruhi tindakan waktu proses.
Tapi untuk masalah desain, yang kedua sangat buruk. Bahkan jika dikompilasi (tidak yakin), itu tidak masuk akal sama sekali.
sumber
{
;-)Foo :: TheFunc () tidak berada dalam namespace yang benar dalam kasus VS. Gunakan 'void X :: Foo :: TheFunc () {}' untuk mengimplementasikan fungsi dalam namespace (X) yang benar.
sumber
Jika Anda hanya membungkus konten .h Anda harus menulis menggunakan namespace ... di file cpp jika tidak, Anda setiap kali bekerja di namespace yang valid. Biasanya Anda membungkus kedua file .cpp dan .h jika tidak, Anda berisiko menggunakan objek dari namespace lain yang dapat menimbulkan banyak masalah.
sumber
Saya pikir hal yang benar untuk dilakukan di sini adalah menggunakan namespace untuk pelingkupan.
namespace catagory { enum status { none, active, paused } }; void func() { catagory::status status; status = category::active; }
sumber
Jika Anda mencoba menggunakan variabel dari satu variabel ke variabel lainnya, saya sarankan untuk mengeksternalisasi variabel tersebut, kemudian menginisialisasi variabel tersebut di file sumber seperti:
// [.hh] namespace example { extern int a, b, c; } // [.cc] // Include your header, then init the vars: namespace example { int a, b, c; } // Then in the function below, you can init them as what you want: void reference { example::a = 0; }
sumber