C ++ 헤더에서 "네임 스페이스 사용"
모든 C ++ 과정에서 모든 교사는 항상 파일 using namespace std;
바로 뒤에 #include
s를 넣 습니다 .h
. 이것은 다른 프로그램에 해당 헤더를 포함시킴으로써 내 프로그램으로 가져온 네임 스페이스를 가져 오거나 어쩌면 의도하지 않거나 원하지 않는 경우 (헤더 포함은 매우 깊게 중첩 될 수 있음) 이후 위험한 것으로 보입니다.
그래서 내 질문은 두 배입니다. using namespace
헤더 파일에 사용해서는 안되며 / 또는 실행 취소 방법이 있습니까?
//header.h
using namespace std {
.
.
.
}
같은 줄을 따라 한 가지 더 질문 : 헤더 파일 #include
은 해당 .cpp
파일에 필요한 모든 헤더를 헤더 정의에 필요한 헤더 만 .cpp
파일 #include
에 나머지 파일을 허용 하거나 필요없는 모든 것을 선언해야 extern
합니까?
질문 뒤에 추론은 위와 동일합니다 : .h
파일을 포함 할 때 놀라움을 원하지 않습니다 .
또한 내가 옳다면 이것이 일반적인 실수입니까? 저는 실제 프로그래밍과 "실제"프로젝트를 의미합니다.
감사합니다.
using namespace
정확히 말한 이유 때문에 헤더에 사용해서는 안됩니다 . 헤더를 포함하는 다른 파일에서 코드의 의미를 예기치 않게 변경할 수 있습니다. 실행을 취소 할 수 using namespace
있는 방법 이 없으므로 위험합니다. 나는 일반적으로 더 복잡한 것을 시도하기보다는 헤더에서 호출되지 grep
않도록하기 위해 등을 사용 using namespace
합니다. 아마도 정적 코드 검사기에서도이 플래그를 지정합니다.
헤더에는 컴파일해야하는 헤더 만 포함해야합니다. 이를 시행하는 쉬운 방법은 다른 헤더보다 먼저 각 소스 파일의 고유 헤더를 첫 번째로 포함하는 것입니다. 그러면 헤더가 자체 포함되어 있지 않으면 소스 파일이 컴파일되지 않습니다. 예를 들어, 라이브러리 내에서 구현 세부 사항 클래스를 참조하는 경우, #include
그러한 선언 된 클래스의 정의를 완전히 제어 할 수 있기 때문에 대신 전달 선언을 사용할 수 있습니다 .
나는 그것이 일반적인 것이라고 확신하지는 않지만, 부정적인 결과를 알지 못하는 새로운 프로그래머가 작성하는 것이 때때로 가끔 나타납니다. 일반적으로 위험에 대한 약간의 교육만으로 문제를 해결하는 것이 상대적으로 간단하므로 문제를 해결합니다.
Sutter and Alexandrescu의 "C ++ 코딩 표준 : 101 규칙, 지침 및 모범 사례" 의 항목 59 :
59. 헤더 파일이나 #include 앞에 네임 스페이스를 사용하지 마십시오.
네임 스페이스
using
는 편의를위한 것이며 다른 사람에게 영향을 미치지 않습니다 . 지시문 앞에using
선언이나using
지시문을 쓰지 마십시오#include
.Corollary : 헤더 파일에서 네임 스페이스 수준
using
지시문이나using
선언을 작성하지 마십시오 . 대신, 모든 이름을 명시 적으로 네임 스페이스로 규정하십시오.
헤더 파일은 하나 이상의 소스 파일에있는 게스트입니다. using
지시문과 선언 을 포함하는 헤더 파일 은 난폭 한 친구도 가져옵니다.
using
선언은 하나의 친구에 제공합니다. using
지침은 네임 스페이스의 모든 친구에 제공합니다. 선생님의 사용은 using namespace std;
사용 지침입니다.
더 중요한 것은 이름 충돌을 피하기위한 네임 스페이스가 있다는 것입니다. 헤더 파일은 인터페이스를 제공하기위한 것입니다. 대부분의 헤더는 현재 또는 미래에 어떤 코드에 헤더가 포함될 수 있는지에 관계없이 사용할 수 있습니다. using
헤더 내에 내부 편의를위한 명령문을 추가하면 해당 헤더의 모든 잠재적 클라이언트에 편리한 이름이 생깁니다. 이름 충돌로 이어질 수 있습니다. 그리고 그것은 단지 무례합니다.
헤더 안에 헤더를 포함시킬 때주의해야합니다. 대규모 프로젝트에서는 실제로 필요한 것보다 더 크거나 더 긴 재 구축을 트리거하는 매우 얽힌 종속성 체인을 만들 수 있습니다. C ++ 프로젝트에서 좋은 물리적 구조의 중요성에 대해 자세히 알아 보려면 이 기사 와 후속 조치를 확인하십시오 .
절대적으로 필요한 경우 (클래스의 전체 정의가 필요할 때마다) 헤더 안에 헤더를 포함하고 가능한 경우 (클래스가 필요한 경우 포인터 또는 참조) 전방 선언을 사용해야합니다.
네임 스페이스의 경우 헤더 파일에 명시 적 네임 스페이스 범위를 사용하고 using namespace
cpp 파일 에만 배치하는 경향이 있습니다.
Goddard 우주 비행 센터 코딩 표준 (C 및 C ++ 용)을 확인하십시오. 예전보다 조금 어려웠습니다 .SO 질문에 대한 업데이트 된 답변을 참조하십시오.
GSFC C ++ 코딩 표준은 다음과 같이 말합니다.
§3.3.7 각 헤더 파일
#include
은 사용자에게#include
필요한 파일 을 요구하지 않고 컴파일해야하는 파일이어야한다 .#includes
헤더에 필요한 것으로 제한되어야한다. 다른#includes
소스 파일에 배치해야합니다.
상호 참조 된 첫 번째 질문은 이제 GSFC C 코딩 표준의 인용문과 이론적 근거를 포함하지만 그 실체는 동일합니다.
당신은 using namespace
헤더에 위험하다는 것이 맞습니다 . 나는 그것을 취소하는 방법을 모른다. using namespace
헤더 파일에서 검색하기 만해도 쉽게 검색 할 수 있습니다. 마지막 이유로 실제 프로젝트에서는 흔하지 않습니다. 더 숙련 된 동료들은 누군가가 이와 비슷한 일을하면 곧 불평 할 것입니다.
실제 프로젝트에서 사람들은 포함하는 파일의 양을 최소화하려고 시도합니다. 더 적은 파일을 빨리 컴파일 할 수 있기 때문입니다. 그것은 모두의 시간을 절약합니다. 그러나 헤더 파일이 무언가를 포함해야한다고 가정하면 헤더 파일을 포함해야합니다. 그렇지 않으면 헤더가 독립적이지 않습니다.
네 말이 맞아 그리고 모든 파일에는 해당 파일에 필요한 헤더 만 포함되어야합니다. "실제 프로젝트에서 일이 잘못되고 있습니까?" - 어 그래!
Like all things in programming, pragmatism should win over dogmatism, IMO.
So long as you make the decision project-wide ("Our project uses STL extensively, and we don't want to have to prepend everything with std::."), I don't see the problem with it. The only thing you're risking is name collisions, after all, and with the ubiquity of STL it's unlikely to be a problem.
On the other hand, if it was a decision by one developer in a single (non-private) header-file, I can see how it would generate confusion among the team and should be avoided.
With regards to "Is there some way to undo [a using
declaration]?"
I think it is useful to point out that using
declarations are affected by scope.
#include <vector>
{ // begin a new scope with {
using namespace std;
vector myVector; // std::vector is used
} // end the scope with }
vector myOtherVector; // error vector undefined
std::vector mySTDVector // no error std::vector is fully qualified
So effectively yes. By limiting the scope of the using
declaration its effect only lasts within that scope; it is 'undone' when that scope ends.
When the using
declaration is declared in a file outside of any other scope it has file-scope and affects everything in that file.
In the case of a header file, if the using
declaration is at file-scope this will extend to the scope of any file the header is included in.
I believe you can use 'using' in C++ headers safely if you write your declarations in a nested namespace like this:
namespace DECLARATIONS_WITH_NAMESPACES_USED_INCLUDED
{
/*using statements*/
namespace DECLARATIONS_WITH_NO_NAMESPACES_USED_INCLUDED
{
/*declarations*/
}
}
using namespace DECLARATIONS_WITH_NAMESPACES_USED_INCLUDED::DECLARATIONS_WITH_NO_NAMESPACES_USED_INCLUDED;
This should include only the things declared in 'DECLARATIONS_WITH_NO_NAMESPACES_USED_INCLUDED' without the namespaces used. I have tested it on mingw64 compiler.
참고URL : https://stackoverflow.com/questions/5849457/using-namespace-in-c-headers
'programing tip' 카테고리의 다른 글
HTTP 엔터티 란 정확히 무엇입니까? (0) | 2020.07.29 |
---|---|
예외 코드“EXC_I386_GPFLT”의 의미는 무엇입니까? (0) | 2020.07.29 |
Node.js에서 next ()를 사용하고 next ()를 반환하는시기 (0) | 2020.07.28 |
boto3를 사용하여 S3 객체를 파일에 저장하는 방법 (0) | 2020.07.28 |
WebView 내부에 외부 웹 페이지를로드하는 방법 (0) | 2020.07.28 |