{
우선 제목 부터 이해해야 될 것 같다.

엔티티:entity는 무엇을 말하는가?
 사전에선 실재, 존재 라고 되어 있는데, C++에선 변수나 함수등을 말한다.

서로 연결된 엔티티:entity는 무엇을 말하는가?
 위에선 변수나 함수들은 엔티티:entity 라고 했는데, 이해를 돕기 위해서 함수가 아닌 변수만 이야기 한다.

 즉, 서로 연결되어 정의된 변수를 뜻한다.

헤더파일에 이런 연결된 엔티티:entity를 정의 하면 안되는가?
 되긴 되나 위험하기 때문에 안된다.

되는 경우는 언제인고, 위험한 경우는 언제인가?
 헤더 파일을 1번만 사용 할 경우, 된다. 하지만 .. 1번만 사용할 헤더는 예제코드 짤 정도밖에 쓰지 않기 때문에, 생각 안하는게 좋을 것 같다.

위험한 경우는, 여러 곳에서 헤더파일이 쓰일 경우, 문제가 된다는 것이다.


여러곳이 어디의 여러 곳인가?
 하나의 프로젝트, 즉 하나의 프로그램을 만들 때 여러 파일들이 바로 "여러곳" 이다.

그럴 경우 왜 위험한가?
 단일 정의 원칙을 위배하여, 링크 에러가 뜬다. 하지만 이건 그래도 컴파일 되기 전에 문제를 알 수 있기에 애교로 봐줄만 하고, 이 애교를 봐주기 위해서 사용하는 몇가지 방법이 매우 위험하다.

그럼 괜찮은 방법은 무엇인가?
 당연히 extern 으로 선언과 정의를 분리하는 방법이다.

그렇다면 위험한 방법은 무엇인가?
 static 키워드를 사용 하는 경우 이다. 이건 정말 위험하다. static const 라면 그런데로 음.. 하고 넘길만 하지만, 그냥 static 은 정말 문제이다.

왜냐하면 이 헤더파일을 사용 하는 모든 파일에 이 변수가 복사 되기 때문에, 각기 같은 이름의 변수가 각기 독립적인 변수로 인식되어, 변수의 변경이 독립적으로 이루어 지기 때문이다.


헉, 그러면 클래스 템플릿, 함수 템플릿들이나 인라인 함수들은 어째?
 이것들은 링커가 예외적으로 복사를 막아 준다. MSVC2005, 2008 에선 막아 주는것을 확인 했는데, 다른 컴파일러는 모르겠다.

테스트 코드를 줄 수 있는가?
우선 s1.h 파일


s2.h 파일


main.cpp 파일


또 예외적인게 있는가?
 슈왈츠 카운터, 니프티(nifity) 카운터라는 전역 데이터 초기화 방식이 있는데, 슈왈츠 카운터의 경우 cin, cout, cerr, clog 초기화에서 사용 된다. MSVC2008 에서 확인해봤는데, dll 을 이용한 방법 같다.(자세한건 나도 찾아 봐야 해서 여기까지 정리한다)
}

'책 정리 > C++ Coding Standards : C++ 코딩의 정석' 카테고리의 다른 글

항목 67 : 계획적이지 않고 일반적이지 않은 코드는 작성하지 말라. ( Don’t write unintentionally nongeneric code. )  (0) 2009.04.12
항목 66 : 함수 템플릿은 특화해서는 안된다. ( Don’t specialize function templates. )  (0) 2009.04.12
항목 64 : 정적, 동적인 다형성을 절적히 혼합하라. ( Blend static and dynamic polymorphism judiciously. )  (0) 2009.04.11
항목 63 : 모듈의 인터페이스 내에는 충분한 이식성을 갖춘 타입을 사용하라. ( Use sufficiently portable types in a module’s interface. )  (0) 2009.04.11
항목 62 : 예외가 모듈의 경계를 넘어 전달되는 것을 막아라. ( Don’t allow exceptions to propagate across module boundaries. )  (0) 2009.04.11
항목 61 : 헤더 파일 내에는 서로 연결된 엔티티를 정의해서는 안된다. ( Don’t define entities with linkage in a header file. )  (0) 2009.04.11
항목 60 : 서로 다른 모듈에서의 메모리 할당과 해지는 피하라. ( Avoid allocating and deallocating memory in different modules. )  (0) 2009.04.11
항목 59 : 헤더 파일 내에 또는 #include 앞에 네임스페이스 using을 써서는 안 된다. ( Don’t write namespace usings in a header file or before an #include. )  (0) 2009.04.08
항목 58 : 특별히 함께 작동하게끔 의도된 경우가 아니라면 타입과 함수는 분리된 네임스페이스에 넣어라. ( Keep types and functions in separate namespaces unless they’re specifically intended to work together. )  (0) 2009.04.08
항목 57 : 타입과 그의 비멤버 함수는 같은 네임스페이스 내에 넣어라. ( Keep a type and its nonmember function interface in the same namespace. )  (2) 2009.04.08
항목 56 : 필요하다면 실패가 없는 swap을 활용하라. ( Whenever it makes sense, provide a no-fail swap (and provide it correctly) )  (0) 2009.04.06
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기

댓글을 달아 주세요

">