2014-10-11 2 views
3
using namespace std; 

지금까지 컴퓨터 과학 과정에서이 모든 것이 수행되었습니다. 뿐만 아니라 우리가 할 수있는 모든 것입니다. 그렇지 않으면 코드에 대한 불이익을 받게됩니다. 나는 온라인에 게시 된 코드를보고 :: std 또는 std ::를 사용하여 동일한 것을 달성 할 수 있음을 이해합니다.네임 스페이스 std 대 다른 대안 사용

내 질문에 왜 그렇습니까? 분명히 학습자와 단순성을 위해서 전역 선언을 사용하는 것이 더 간단하지만, 그려지는 것은 무엇인가? 실제 응용 프로그램에서 :: std를 기대하는 것이 더 현실적입니까? 그리고 이것에 덧붙여서, 사용 선언 뒤에있는 논리/개념은 무엇입니까? 이 모든 것은 내 과정에서 설명되지 않았으므로 나는 그것에 대해 더 잘 이해하고 싶습니다.

일반적인 질문으로 :이 콘텐츠, 벡터, 템플릿, 클래스 또는 오류 처리에 대해 배우지 않은 경우 C++의 필수 기능이 많이 누락 된 것처럼 보입니까?

미리 감사드립니다.

+2

을 내가 [이 질문을 읽고 약간의 시간을 제안하고 것 다양한 게시 된 답변] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice). 무의식적으로 번역 단위에 앉아있는 'namespace std 사용하기'가 예기치 않은 결과를 낳은 상황의 * 뛰어난 예 * [여기를 볼 수 있습니다] (http://stackoverflow.com/questions/2712076/how-to-use-an --iterator). 읽어야 할 가치가 있습니다. – WhozCraig

+0

감사합니다. 나는 그것을 조사 할 것이다! 미리 몇 가지 예를 찾으려고했지만 많은 경우 "예 * 가끔 문제가 발생할 수 있습니다."와 같았습니다. 증거도없이. – user3857017

+1

*** 네임 스페이스를 사용하는 *** 무분별한 *** 사용법은 많은 미묘한, 찾기 어려운 버그로 이어질 수있는 IMHO ** 나쁜 습관 **입니다. 그것은 네임 스페이스가 처음부터 시작하기 위해 도입 된 모든 이유를 우회합니다. 즉, 범위가 ** 제한된 ** (네임 스페이스 또는 로컬 범위에 따라) 인 경우 네임 스페이스 사용에 대한 적절한 사용이 있다고합니다.그럼에도 불구하고'std' 네임 스페이스는 매우 커서 ** 많은 ** 공통 기호를 포함하므로 항상 *** 네임 스페이스 표준을 사용하지 않습니다. ** 참고 자료 : ** [The C++ FAQ] (http://www.parashift.com/c++-faq/using-namespace-std.html) – Galik

답변

3

이것은 실제로 몇 시간 동안 맥주에 관해 토론 할 수있는 것들 중 하나이며, 여전히 모든 사람들이 만족할만한 답변을 가지고 있지 않습니다.

거의 항상 std:: 기능을 사용하는 경우 파일 시작 부분에 using namespace std;을 추가하는 것이 좋습니다. 반면에 하나 이상의 네임 스페이스 (예 : llvm::을 사용하여 컴파일러를 작성하고 std::을 사용하는 컴파일러를 사용하는 경우 어떤 부분이 llvm이고 어떤 부분이 std::인지 혼동 스러울 수 있습니다. 따라서 컴파일러 프로젝트에서 , 나는 하나의 파일이 using namespace ...; 인 대신에 -과 std::을 필요에 따라 씁니다. Type()이라고하는 여러 함수가 있습니다. (아마도 부작용이있을 수 있습니다.) 어떤 경우에는 something->Type()->Type()을 사용하여 필요한 유형을 얻습니다. 그렇습니다. 때로는 조금 혼란 스럽습니다 ...

나는 또한 "무엇이 무엇인지"를 빨리 볼 수 있도록 Constants::ConstDeclToken::RightParen과 같은 많은 것들이 있습니다.이 모든 것들이 만들어 질 수 있습니다. 호러와 "더 간단하다". 그러나 나는 물건이 대부분의 시간에 속하는 곳을보기를 더 좋아한다.

더 자세한 정보를 제공하면 물건이 어디에 속해 있는지 쉽게 알 수 있습니다. 그러나 더 많은 입력과 읽기가 필요하므로 균형이 맞습니다.

+1

'네임 스페이스를 사용하여 하나의 파일을 가지고 있지 않습니다 ...; '+1; 이런 식으로 선호하는 많은 개발자 (나 자신 포함)를 안다. – Qix

+2

@Qix 방금 "어떻게 이것이 완료되었는지"(예를 들어) 보여주기 위해 코드를 해킹 할 때'using namespace std; '를 사용하는 것이 좋습니다. 하지만 제 컴파일러 프로젝트와 다른 큰 프로젝트에서는 그렇지 않습니다. –

+0

물론, 그것은 합리적인 것입니다. – Qix

1

나는 일반적으로 std를 전역 적으로 선언하지 않는다고 말하고 싶다. 나는 당신이 간단한 응용 프로그램을 만들고 있다면 충분하다고 생각합니다. 그러나 대규모 조직에서 작업 할 때 종종 서로 다른 네임 스페이스가 사용되며 중복되는 개체가있을 수 있습니다. std에 함수가 있고, 생성 한 네임 스페이스에서 "using namespace std"및 "namespace yournamespace 사용"을 호출하면 해당 함수를 호출 할 때 원하지 않는 결과를 얻게됩니다. 모든 호출에 네임 스페이스를 접두어로 붙이면 명확하게 유지되고 겹침 문제가 발생하지 않습니다.

+1

모든 호출을 네임 스페이스 앞에 접두어로 붙이는 것은 ADL이 여전히 작동하기를 원한다면 실행 가능한 방법이 아닙니다. 주어진'namespace std; 템플릿 void Foo (T & a, T & b) {swap (a, b); }', 네임 스페이스 N {struct S {};를 계속 허용하기 위해'swap '에 대한 호출을 어떻게 바꿀 것인가? void swap (S &, S &); }', Foo '는'std :: swap' 대신'N :: swap'을 호출해야합니까? – hvd

+1

그렇다면'using'이 필요하지만'namespace std' 대신에 원하는 함수로 제한 할 수 있습니다. – hvd

+0

그래서 뭔가가 수행되고있는 "장소"와 같은 네임 스페이스 정렬입니까? 표준처럼 그냥 화면 I/O입니까? 라이브러리의 함수 정의 중 일부를 살펴본 결과, 다른 :: xxx 공백과 같은 모양을 보았으며 파일 I/O 또는 프로그램 간 I/O와 같은 것으로 가정했습니다. 내가 틀렸다면 나에게 정정 해주세요. 왜냐하면 이것은 모두 나를 위해 발견 된 땅이기 때문입니다. – user3857017

1

일반적인 이유는 무엇입니까?

이름 짓기는 소프트웨어 개발에서 더 어려운 측면 중 하나입니다. 초보자는 나중에 자신의 이름 선택이 어떻게 모호성을 일으키는 지 거의 알지 못합니다.

특히 Google의 소프트웨어 전문 용어는 특정 문제에 대해 자주 사용되는 용어입니다. 이러한 기본 설정을 통해 관련없는 클래스 인스턴스가 비슷한 의미의 동일한 (또는 유사한) 기호로 개발 될 수 있습니다.

자주 사용되는 기호 중 일부는 init(), exec(), load(), store()를 포함하며 timeStampGet()을 많이 사용합니다. 또한 open(), close(), send()/recv() 또는 write()/read()를 사용합니다.

그래서 3 개의 이름 공간과 5 개의 객체에서 init()의 이름을 바꿀 수는 있지만 내가 원하는 것을 지정하는 것은 훨씬 간단합니다.
exec()는 2 개의 이름 공간과 12 개의 객체에서 찾습니다. 그리고 내가 사용하는 3 가지 다른 timeStampGet() 메소드가 있습니다. 네임 스페이스 또는 함수 또는 클래스 메서드이든이 기호는 나에게 의미가 있습니다.

또한 5 char "std ::"네임 스페이스 - 접두사가 완전히 자연스럽고 "네임 스페이스 표준을 사용하는"글로벌 선호도보다 훨씬 좋습니다. 나는 이것이 연습과 함께한다고 생각한다.

또 하나 개의 항목이

- 큰 이름 공간 또는 클래스 이름 무심 될 경우 어떤, 가끔 타입 정의 짧은 이름을 추가 ... 여기에서 생산 코드에서 몇 가지 예입니다 :

typedef ALARM_HISTORY ALM_HST; 
typedef MONITOR_ITEM MI 
typedef BACKUP_CONTROL BC; 

팀에 1 점에, 우리 잘 정의 된 '전체'이름을 사용하기로 동의했으며, 때로는 길이 때문에 무심 해졌습니다. 나중에이 프로젝트에서 우리는 typedef (짧은 클래스 또는 네임 스페이스 이름)가 단순하고 혼란이 없을 때 사용될 수 있다는 데 동의했다.

+0

그건 내 머리 위로 다소이지만, 적어도 내 질문에 관해서는 전제가 있다고 생각합니다. 고마워요! – user3857017

1

개인적으로 나는 '선언'을 사용하는 것을 싫어합니다. 나에게 그들은 코드를 읽을 수 없게 만들고 네임 스페이스를 깨뜨린다. 저는 유지 보수 프로그래머로서 20 년을 보냈습니다. 코드를 읽기가 더 어렵게 만드는 것을 싫어합니다. 내 마음을 사용하면 사양을 던지면 쓸모가 없습니다.

은 더 읽기 6개월 무엇입니까 - 년 - 나는 또한 당신이 지금 네임 스페이스 별칭을

using namespace po = boost::program_options; 

을 좋아하지 않아

UDP::Socket sock 
sock.send(data) 
TCP::Socket sock2 
sock2.send(data) 

using UDP; 
using TCP; 
sock.send(data) 
sock2.end(data) 

대 선 아래로 십년 boost :: program과 비교되는 po를 찾는 추가 수준의 간접 참조로 다음 프로그래머를 더욱 힘들게 만들고있다. _options.

typedef long QUADWORD; 

끔찍한 typedef와 동일합니다. 4 바이트 길이는 얼마나됩니까? 8 바이트 내 OS에 아마 17 바이트

나의 최근 걸릴 당신이 프로그래머하지 말고 다음 입력 할 수없는 경우입니다 -! 저장된 키 스트로크 (keystroke) = 좋은 유지 보수 코드

관련 문제