Bagaimana saya bisa "tidak menggunakan" namespace?


86

Salah satu keanehan sistem pengembangan saya (Codegear C ++ Builder) adalah bahwa beberapa tajuk yang dibuat secara otomatis bersikeras memiliki ...

using namespace xyzzy

... pernyataan di dalamnya, yang berdampak pada kode saya ketika saya tidak menginginkan atau mengharapkannya.

Adakah cara agar saya bisa membatalkan / menimpa pernyataan "menggunakan" sebelumnya untuk menghindari hal ini.

Mungkin...

unusing namespace xyzzy;

3
Anda mungkin harus membuka laporan bug dengan sistem QC mereka: qc.codegear.com
Kris Kumler

2
BTW, apakah tajuk yang dibuat secara otomatis ini?
Kris Kumler

2
Suatu hari C ++ akan memiliki modul, dan memasukkan kode ke dalam kode lain akan memiliki konstruksi enkapsulasi yang lebih baik. Sampai saat itu, tidak ada cara yang mudah untuk mengatasi hal ini. Pertimbangkan untuk memasukkan kode Anda sendiri ke dalam namespace dan merujuknya seperti itu.
Trevor Hickey

Jawaban:


59

Nggak. Tetapi ada solusi potensial: jika Anda menyertakan direktif include Anda di namespace-nya sendiri, seperti ini ...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

... maka efek dari setiap arahan penggunaan dalam tajuk itu dinetralkan.

Itu mungkin bermasalah dalam beberapa kasus. Itulah mengapa setiap style guide C ++ sangat menganjurkan untuk tidak meletakkan perintah "using namespace" di file header.


1
Secara umum, ini adalah ide yang buruk . Header C ++ tidak dimaksudkan untuk disertakan dalam namespace alternatif seperti yang digunakan di sini.
Aaron

25
Itu ide yang buruk untuk menyertakan direktif menggunakan di file header juga. Ini hanya mengurangi masalah itu.
Kepala Geek

4
Menempatkan tajuk di namespace Anda sendiri bukanlah solusi karena mengubah arti deklarasi di pustaka itu. (-1)
Richard Corden

4
Itu sepenuhnya bergantung pada apa yang dideklarasikan di header.
Head Geek

1
Itulah mengapa itu adalah perilaku yang tidak terdefinisi.
Kris Kumler

56

Tidak, Anda tidak dapat membatalkan penggunaan namespace. Satu-satunya hal yang dapat Anda lakukan adalah meletakkan using namespace-statement sebagai blok untuk membatasi cakupannya.

Contoh:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Mungkin Anda dapat mengubah template yang digunakan untuk header yang dibuat secara otomatis.


Bisakah Anda membungkus sebuah penyertaan dalam blok seperti ini?
Gerhana

Ya, ini tidak akan terjadi dengan kode yang dibuat secara otomatis. Byt mybe dia bisa mengubah template untuk kode yang dibuat secara otomatis?
jk.

Ya, ini tidak benar-benar mengatasi masalah yang dia alami tentang tajuk menggunakan ruang nama.
Kip

Sayangnya, ini tidak benar. Coba ini:
Adam

namespace xyzzy {const int i {menggunakan namespace xyzzy; } // berhenti menggunakan namespace xyzzy di sini
Adam

17

Anda mungkin terjebak menggunakan namespace eksplisit pada konflik:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

10

Untuk referensi di masa mendatang: karena versi XE ada nilai baru yang dapat Anda # using namespace System;tentukan untuk menghindari int yang ditakuti , termasuk: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


Tapi ini sepertinya tidak berfungsi dengan baik. Setidaknya dalam semua kasus saya mencoba (dengan BCB6). Saya kemudian menggunakan untuk kembali menambahkan ruang nama eksplisit pada konflik dan - bahkan lebih buruk - menyertakan tajuk untuk menghindari konflik nama jenis ...
Wolf

5

Bagaimana jika menggunakan sed, perl atau beberapa alat baris perintah lainnya sebagai bagian dari proses pembangunan Anda untuk memodifikasi header yang dihasilkan setelah dibuat tetapi sebelum digunakan?


1

Percobaan cepat dengan Visual Studio 2005 menunjukkan bahwa Anda dapat menyertakan header tersebut di namespace Anda sendiri dan kemudian useapa yang Anda butuhkan dari namespace ini (tapi jangan useseluruh namespace, karena akan memperkenalkan namespace yang ingin Anda sembunyikan.


1
Ini kemungkinan besar akan menyebabkan masalah pengubahan nama jika file header adalah deklarasi untuk sebuah perpustakaan. Kompilasi akan berhasil, tetapi linker tidak akan dapat menemukan definisi, karena mereka telah dikompilasi di namespace yang berbeda.
Gerhana

-1
#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}

1
tolong jelaskan jawaban Anda!
Mazz

Anda dapat menggunakan operator resolusi cakupan untuk menggunakan variabel namespace lain
Narendra kumawat

3
Tidak menjawab pertanyaan
MM
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.