왜 ',' 나쁜 것으로 표준용량 이름공간이 사용하여 연습? 이것은 it 위험 비효율적이었습니다 않거나 모호한 변수 선언 (변수 '를 공유하는 이름이 같은 기능을 표준용량' 이름공간이)? 성능에 영향을 미칠 있습니까?
이는 전혀 관련이 없는 성능을. 그러나 이러한 측면에서 볼 때: foo 라는 두 개의 라이브러리를 사용하는 및 표시줄에는:
using namespace foo;
using namespace bar;
다 블라 () '에서' 와 'Foo 호출하십시오 작동합니다 수 있습니다 ()' 에서 표시줄에는 크루스 문제 없이. 하지만 어느 날, 어떤 함수 호출 '는 Foo 의 새로운 버전 2.0 업그레이드합니다 크루스 ()'. 이제 you& # 39, ve got a 충돌: Foo 2.0 및 표시줄에는 가져오기의 크루스 () '를 모두' 글로벌 이름공간이. 만약 함수가 매개변수를 해결하십시오 일이 걸릴 것, 특히 이는 작업량의 일치시키려면.
사용 했을 경우, 'foo 기타 등등 ()' 와 '표시줄에는 크루스 ()', '다음' 도입을 foo 크루스 () 는 이벤트가 아닌 있었을 것이다.
I agree 있는 모든 것 [그렉이야 작성했습니까] (https://stackoverflow.com/questions/1452721/1452738 # 1452738) 이지만, I& # 39; d like to 추가: _It 확보하십시오 _을 그렉이야 밑구녕만도 수도 있을 것 "이라고 말했다.
라이브러리 함수, 할 수 있는 ',' () 는 Foo 2.0 소개하십시오 크루스 조금 더 나은 경기를 일부 서비스에 대한 통화 '크루스 ()' 이 아닌 '표시줄에는 크루스 ()' 라는 코드에 대한 년이다. 하지만 여전히 그런후에도 너회의 code compiles it 페이징됩니다 자동으로 잘못된 function 신 알 무엇을 않습니다. # 39 에 대한 that& 만큼 힘든 것을 얻을 수 있다.
',' 는 점에 유의하십시오 표준용량 이름공간이 톤의 식별자입니다 대부분 very 일반적인 수준들과 (생각하노라 '목록', '정렬', '구체화하십시오', '반복자가' 등) 에 나타날 수 있는 가능성이 매우 높다고 기타 코드, 고쳐주렴.
이 경우 고려해보십시오 어려울 것 같다. [질문 질문과대답] 있었다 (https://stackoverflow.com/a/2712125/140719) 에 있는 예쁜 애썼는데요 frequencyid 스택할 오버플로입니다 들어온넘 (잘못된 함수 호출 생략된 표준용량 인해 '' 접두어입니다) 이 약 반 년 후에 내가 준 이 대답. [Here] (https://stackoverflow.com/questions/13402789/) 는 최근 들어 등 다른 점이다. 이 때문에 큰 문제가 있다.
지난 몇 십 년 동안 늘어난 만 회선 규모의 프로젝트를 할 수 있는 증상이다. 이후 이러한 논의에 다시 한 번, 내가 얼마나 자주 올라와 눈길을 끌었다 (허용) 함수 범위 실제로 있었던 "사용 '입니다. 내가 grep& # 39 이 곳을 찾을 수 있으며, 오직 하나 또는 두 개, d 배포된다. 사용되었습니다. # 39, t, 개발자, 한 번 시도해 다는일은 나타냅니다 don& 찾을 수 있을 만큼 '아픈' 표준용량 구사할 수 있는 100 명당 한 번도 디렉티브에는 사용하여 클로스 전송되었기 사용할 수 있다.
결론: # 39 는 거의 모든 것을 명시적으로 접두사가 doesn& 할 수 있으며, 목표, t 해치지 가져오는 데 사용할 수 있습니다. 특히 는 코드를 통해 쉽게 해석할 수 있는 주요 목표 및 컴파일러 및 코드 작성 할 때 인간이 판독기에서 - 할 것 같습니다.
문제는 '있다' 를 통해 누구나 클래스뿐만 이름공간이 헤더 파일 사용 가능한 것이 docname who wants to use your 클래스뿐만 & # 39 (대표 너회의 헤더 파일 등) 을 할 수도 있지만, using& # 39. 이들 (즉, 모든 것을 볼 수 있는) 다른 네임스페이스을.
그러나 언제든지 사용할 수 있습니다 (전용) 를 넣을 수 있는 기술서임을 *.cpp 파일.
어떤 사람들은 저의 말을 함께 느낄 수 있는 두려워 " free", 전혀 그렇지 않다. 이 때문에 비록 '-' cpp 파일을 사용하여 같은 문을 있는 것보다 더 나은 머리글 (# 39 doesn& 영향을 미치지 않기 때문에, 사람들은 너회의 헤더 파일 포함), 아직 # 39 의 it& 생각하는 좋은 (같도다라고 따라 더 어렵게 만들 수 있다는 점에서 코드 구현 클래스를 유지관리하지). [이 c++컴파일러는 슈퍼 faq 초급형] (https://isocpp.org/wiki/faq/coding-standards # 이름공간이 사용하여 표준용량) 합니다.
>. 이 디렉티브을 사용하여 쉽게 전환할 수 있는 기존 c++ 코드와 네임스페이스을, 하지만 당신은 아마 정기적으로 전혀 안 쓸 수 있는 새로운 c++ 코드를.
Faq 를 제안됩니다 두 가지 옵션:
표준용량 코트 사용하여. 검증 없이 사용할 수 있는 사용하는 것이다. 코트 // 코트 < <; values:" ";;
표준용량 코트 < <; values:" ";;
나는 이번에 붙여넣습니다 실행했음 불만을 [Visual& Studio&; 빨리, 빨리, 2010년] [1]. 거의 모든 소스 파일을 이 두 줄 것으로 드러나 있었다.
using namespace std;
using namespace boost;
앞으로 많은 [향상시키십시오] [2] 피쳐에는 꽂으십시오 C++0x 표준,,, 2010년 는 많은 기능을 사용할 수 있을 만큼 빨리 Visual& Studio& C++0x 도왔으매 갑자기 이 프로그램은 컴파일하기를 않았습니다.
따라서 X ',' 은 피할 수 있도록 방법을 사용하여 이름공간이, 미래 형태의 변화를 가져온 라이브러리보다는 및 / 또는 헤더 파일 사용 중인 프로그램 분할하려면 일이 아니다.
[1]: http://en.wikipedia.org/wiki/Microsoft_Visual_Studio # Visual_Studio2010 [2]: http://en.wikipedia.org/wiki/Boost% 28C% 2B% 2B_libraries% 29
파선-짧은 버전: # 39 의 헤더 파일 사용, t '또는' 선언을 통해 글로벌 don& 디렉티브에는. 그 느낌을 자유롭게 사용할 수 있는 구축상의 파일. # 39 의 here& 어떤 허브 서터 및 Andrei 알렉산드르 에스쿠 에서 [c++컴파일러는 코딩 표준] [3] 이 문제에 대해 말하지 않을 수 없다 (굵게 표시 이를 강조하기 위해 is mine):
>. # # 요약 >. 이름공간이 사용 아닌 다른 사용자의 편의를 위해 고통을 당신꺼에요 에 있다. # Include 디렉티브을 받기 전에 디렉티브을 사용하여 선언 또는 사용하여 쓰지 않았다.
>. 따름정리: 의 헤더 파일 사용, 타냐한테 쓰기 이름공간이 수준 디렉티브에는 사용하거나 선언. 대신 모든 이름을 명시적으로 이름공간이 검증. (두 번째 규칙은 inet6.0 &solarisdvd 먼저 알고 있기 때문에 결코 다른 헤더입니다 # dm_ownerdm_owner 헤더도 저들이요 후 나타날 수 있습니다)
>. # # 토론 >. 한 마디로. 이후 자유롭게 사용할 수 있는 파일 시스템 구축을 통해 및 이름공간이 선언 및 디렉티브에는 # include 디렉티브에는 및 이에 대한 기분이 좋다. 거듭된 어설션을 오히려 이름공간이 선언 및 사용 목적이 있지 않는 패배를 디렉티브에는 악을 네임스페이스을. 할 게 아니라, 즉 네임스페이스을 가용 .
[3]: http://www.amazon.com/coding-standards-rules-guidelines-practices/dp/? 키드 = 0321113586, 1415044651, sr = = = ie /ref sr_1_1 utf8& & 2b% 2b% 20coding% 20standards 여러_키워드 = c% 8-1&.
template <typename FloatType> inline
FloatType compute_something(FloatType x)
{
using namespace std; // No problem since scope is limited
return exp(x) * (sin(x) - cos(x * 2) + sin(x * 3) - cos(x * 4));
}
이는 명시성 검증 (''. ',' 표준용량 cos 표준용량 보내거늘) 보다 더 짧은 계시한하나님께 다룰 수 있는 능력이 있기 때문에, 사용자 정의 부동 소수점 유형 (통해 인수 종속적입니다 조회 (adl)).
It 고려되는지 " bad"; 전 세계적으로 사용할 경우에만 . 이유:
박으래도 및 사용 로칼에서 (거의) 이 있다. 물론, 이 중 '-' 표준용량 및 반복 또 반복 나쁜거라 못하게 합니다.
상용구 코드 C++03 에서 좁히어 인턴이었을때를 관용구 - - 'a' '기능을 구현하기 위한 스왑할 단축시킵니다 클래스뿐만. 실제로 사용할 수 있는 전송되었기 제안됩니다 사용하여 로컬 '또는': '-' 표준용량 스왑이란 사용하여 표준용량 이름공간이 적어도
class Thing {
int value_;
Child child_;
public:
// ...
friend void swap(Thing &a, Thing &b);
};
void swap(Thing &a, Thing &b) {
using namespace std; // make `std::swap` available
// swap all members
swap(a.value_, b.value_); // `std::stwap(int, int)`
swap(a.child_, b.child_); // `swap(Child&,Child&)` or `std::swap(...)`
}
이 높여줍니까 정보정의다음 매직:
C++11 이 패턴이 더 이상 사용할 수 있는 이유가 없다. 구현 '는' 표준용량 스왑이란 변경일 com/go/downloads_kr 잠재적인 오버로드할 선택하고 있다고 말했다.
너 같은 경우 갑자기 오른쪽 임포트하십시오 헤더 파일 이름이 '진수', '왼쪽', '플러스' 또는 '수' 에 글로벌 내시경이요 이 이름은 '이 포함되어 있다는 사실을 알고 있지 않으면 표준용량' 깜짝 놀랄 수도 있다. 또한 이러한 이름을 사용하려고 할 경우 일부 혼란이 꽤 로칼에서 될 수도 있습니다.
만약 모든 물건을 자체 이름공간이 너회가 don& # 39 는 표준, 또는 기타 라이브러리를 통해 이름 충돌을 코드에 대해 걱정할 필요가 없다.
자신의 문제를 해결할 수 있는 숙련된 프로그래머에 있는모든 사용하여 만들어진 새로운 문제를 피할 것을 피하고, 그들은 헤더 파일 수준 디렉티브에는 사용하여 엔드입니다 정확한 이유는.
또한 그들의 이름을 숙련된 프로그래머가 소스 파일을 완벽하게 검증 인사이드라면 피하는 것이 좋습니다. 작은 이유는 에로남이네 it& 쓸 때, 더 적은 코드 코드 s not 우아한 # 39 는 충분하나니 좋은 이유 없는 . 주된 이유는 선반가공 끄기도구 인수 종속적입니다 조회 (adl) 이 있다.
이러한 좋은 이유는 무엇입니까? 가끔 프로그래머가 명시적으로 ADL, 일부러 다른 시간을 끌 것인지.
그래서 다음은 확인:
I agree 사용하지 않는 것이 아니라 전역으로라는 it& # 39 에 사용할 수 있는 ',' 이름공간이 로칼에서 이글거리 높지 않다는 것. 예를 들어, s # 39 에서 here& ", C++ 프로그래밍 Language", :
namespace My_lib {
using namespace His_lib; // Everything from His_lib
using namespace Her_lib; // Everything from Her_lib
using His_lib::String; // Resolve potential clash in favor of His_lib
using Her_lib::Vector; // Resolve potential clash in favor of Her_lib
}
이 예에서는 잠재적인 이름을 해결됨으로 발생하는 충돌 · 모호성 그들위에 컴포지션입니다.
이름을 명시적으로 선언된 좁히어 (선언을 통해 선포한 'like' 등 이름을 his_lib::string) 보다 우선 순위가 시행하십시오 브라운아저씨의 접근할 수 있는 또 다른 이름은 의해 유효범위 디렉티브을 사용하여 ('flexlm*용 이름공간이 her_lib').
난 또 간주할 나쁜거라 주장한다. 왜? 단 하루 생각해봤죠 작업자쪽에서 작동입니다 네임스페이스는 물건을 나눠, 그래서 모든 것을 하나의 글로벌 안싸거든 shouldn& 관직, t # 39 이 문제를 던지기
그러나 만약 내가 # 39, & # 39 cout& 사용하는 경우가 많습니다. # 39, & # 39, 그리고 cin& 써요. 표준용량 코트 사용하여 '. 혓바닥 표준용량 지크프, '를 사용하여 파일 (처음 있는 것처럼 헤더 파일 # include 을 (를)' 전달 '). 내 생각에 아무도 '는' 또는 '란 이름을 판매업체에서 스트리밍합니다 코트 혓바닥을'. )
이들 중 한 것을 보면 정말 좋은 아이디어 it& # 39 의 경우 단 한 번도 교사 및 모든 코드를 유지관리하지 쓰고 있었다. 내가 좋아하는 것을 잘 알고 있는 않니다 코드 (1). # 39 m, 및, (2) 이 사람의 않니다 먹어서나 I& 충분히 알고 있었습니다.
다른 스타일을 가진 사람들이 작성한 코드를 읽을 수 있어야 합니다 의견 및 모범 사례를 than you.
고려해보십시오
// myHeader.h
#include <sstream>
using namespace std;
// someoneElses.cpp/h
#include "myHeader.h"
class stringstream { // Uh oh
};
이것이 간단한 예를. # 39, ll, you& 포함되어 있는 파일이 있는 경우 20 톤 및 기타 임포트합니다 투명지에 거치도록 종속물과의 그림 아웃해야 문제다. 대해서 못한 것은 다른 모듈에서는 연관해제된 오류를 갈등이 redefinitions 따라 얻을 수 있습니다.
동시에 사용하는 것은 분명히 네임스페이스을 많이 사용하지 않지만, 그냥 '만' 과 '표준용량 조리법에 대한 재해 이름공간이 표준용량' 는 제가 보기에 이름공간이 크지 않아 거래가 발생할 수 있기 때문에 자신의 코드를 통해 디렉토리에만 재정의에 있다.
그럼 그냥 그들을 고려해보십시오 스케줄됨 역할을 과 같은 이름의 " int"; 또는 " class"; 바로 그 것이다.
그래서 사람들이 그것에 대해 항문 기술입니까 막지 말아야 한다. 해당 교사는 물론 모든 것은 맞는 말이다. 한 이름공간이 됩니다. 즉 집중식으로 네임스페이스을 사용하여 전체 1 위를 차지했다. 당초 두 개 이상의 동시에 사용할 수 없습니다. 것이 아니라면, 있습니다. 결국 다시 재정의에 일어나지 않습니다.
네임스페이스는 명명된 내시경이요 네임스페이스을 그룹화하려면 선언 및 관련 계속 사용하는 별도의 항목에서와 별도의. 예를 들어, 두 개의 라이브러리를 가리키는 이름이 같은 다른 개발했습니까 별도로 사용할 수 있습니다. 하지만 여전히 항목을 모두 사용할 수 있습니다.
namespace Mylib{
template<class T> class Stack{ /* ... */ };
// ...
}
namespace Yourlib{
class Stack{ /* ... */ };
// ...
}
void f(int max) {
Mylib::Stack<int> s1(max); // Use my stack
Yourlib::Stack s2(max); // Use your stack
// ...
}
기분 전환 될 수 있는 이름공간이 리피팅 이름을 모두 판독기에서 및 작성기에. 따라서 가능하다 특정 상태) 에서 이름을 이름공간이 명시성 검증 없이 사용할 수 있습니다. 예를 들면 다음과 같습니다.
void f(int max) {
using namespace Mylib; // Make names from Mylib accessible
Stack<int> s1(max); // Use my stack
Yourlib::Stack s2(max); // Use your stack
// ...
}
다른 버전의 다른 라이브러리 및 관리를 위한 도구를 통해 강력한 네임스페이스을 코드. 특히 이들 제안하십시오 프로그래머용 대안이 될 수 있도록 어떻게 명시성 대한 참조입니다 비지역 이름.
출처: 개요입니다 C++ 프로그래밍 언어 비야네 스트롭스트룹 의해
내가 여기에 동의하지 않지만, 다른 싶다 가독성을 대한 우려를 해결하기 위해 모든 것을 방지할 수 있습니다 - 네 파일에 함수나 클래스 선언에 메리 페데프스 사용하기만 하면 맨 위에.
난 보통 클래스 메서드를 사용하여 클래스의 내 이 선언을 한 유형 (명) 와 유사한 데이터를 다루는 경향이 메리 페데프 백업이었습니다 이름을 지정할 수 있는 의미 있는 맥락에서 풀이된다. 사실은 이 가독성을 aids 에 대한 정의가 클래스용 방법.
// Header
class File
{
typedef std::vector<std::string> Lines;
Lines ReadLines();
}
또한 구축상의:
// .cpp
Lines File::ReadLines()
{
Lines lines;
// Get them...
return lines;
}
반대로:
// .cpp
vector<string> File::ReadLines()
{
vector<string> lines;
// Get them...
return lines;
}
또는:
// .cpp
std::vector<std::string> File::ReadLines()
{
std::vector<std::string> lines;
// Get them...
return lines;
}
구체적인 예를 대해 우려를 표시했다. 상상도 할 수 있는 상황에서 ',' foo '와' 표시줄에는 각각 2 개의 라이브러리를 자신의 이름공간이:
namespace foo {
void a(float) { /* Does something */ }
}
namespace bar {
...
}
이제 ',' s foo '와' 표시줄에는 let& # 39 라고 자체 프로그램을 함께 사용하면 다음과 같습니다.
using namespace foo;
using namespace bar;
void main() {
a(42);
}
이 시점에서 모든 것이 좋다. # 39, & # 39 는 사용자 프로그램을 실행할 때, 이 something&. 그러나 나중에 '와' 표시줄에는 업데이트했는지 let& # 39 의 다음과 같은 수 있다고 말할 수 있다.
namespace bar {
void a(float) { /* Does something completely different */ }
}
이 시점에서 you& # 39, ll get a 컴파일러와의 오류:
using namespace foo;
using namespace bar;
void main() {
a(42); // error: call to 'a' is ambiguous, should be foo::a(42)
}
그래서 you& # 39, & # 39, a& # 39 명확히 할 필요가 있는 어떤 유지 관리 합시다. 그 'foo a'. 그러나 다행히 that& # 39 의 바람직하지 않은 것은 상당히 쉽게 (추가하기만 '푸' 통화 'a' 로 자국이야 컴파일러와의 앞에 있는 모든 모호한).
하지만 이런 경우를 상상해 볼 수 있는 대체 표시줄에는 변경일 대신 대신:
namespace bar {
void a(int) { /* Does something completely different */ }
}
이 시점에서 갑자기 전화를 통해 '로 a (42)' 를 '대신' 와 '대신' 바인딩됩니다 표시줄에는 a # 39, & # 39 something& foo a 하고. # 39, & # 39, 완전히 different& 않니다 뭔가. 컴파일러와의 경고 또는 아무 것도 없다. 그냥 묵묵히 일을 시작 전에 다른 프로그램에 비해 완료하십시오.
결국 이는 브리타빌레티 vs. 신뢰성 / 사이의 상관 관계를 유지 관리. 또한 볼 수 있는 요인이 될 수 있지만, 내가 가독성을 인수에 대해 어느 쪽이든. 내가 이렇게 말할 수 있지만, 이 경우 일반적으로 신뢰성 및 유지 관리 중요하다는 you& 브리타빌레티 비용, 유지 관리에 대한 신뢰성 / ll 끊임없이 이슬람세를 상당히 희귀한 # 39 라고 말하기도 했다. # 39, & # 39 는 best&. 그러나 프로젝트와 우선 순위에 따라 결정할 것이라고 말했다.