{
우선 제목 부터 이해해야 될 것 같다.
엔티티: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 을 이용한 방법 같다.(자세한건 나도 찾아 봐야 해서 여기까지 정리한다)
}
최근댓글