2013-09-25 1 views
1

그래서 코드를 정리하고 전역 상수 (char const * strings 등)를 별도의 cpp 파일에 정의하고 extern을 선언하는 헤더가있는 제안을 발견했습니다. 그런 다음 필요할 때마다 헤더를 포함하고 단일 위치에서 변수에 액세스 할 수 있습니다. 예를 들어extern 선언을 사용하여 헤더 파일을 만드는 점은 무엇입니까?

strings.hpp

extern char const* strA; 
extern char const* strB; 

strings.cpp이 내가 생각했지만, 조금 후에는이가는 것을 나에게 발생, 감각을 만들어

#include "strings.hpp" 

char const* strA = "strA";  
char const* strB = "strB"; 

프로젝트의 큰 덩어리를 불필요하게 다시 컴파일 할 수 있습니다. 예를 들어, 모든 문자열을 함께 보관하면 새 문자열을 추가 할 때마다 헤더를 수정해야합니다. 즉, 해당 헤더를 포함하는 모든 cpp 파일이 다시 컴파일됩니다. 프로젝트가 복잡 해짐에 따라 시간이 많이 걸릴지는 확실치 않지만이 점이 합쳐질 수 있습니다.

이 문제에 대한 해결책이 아이디어를 유지하는 대신 헤더를 포함, 선언하고 하나 개의 cpp 파일에서 상수를 정의하는 것이 나에게 보인다

strings.cpp

extern char const* strA; 
extern char const* strB; 

char const* strA = "strA";  
char const* strB = "strB"; 

그런 다음 문자열을 필요로하는 파일에, 나는 필요한 변수

에게

extern char const* strA; 
A.cpp 선언

B.cpp

extern char const* strB; 

는 기본적으로 수동으로 나를 위해했을 포함하는 일.

C.cpp에서 사용 된 char const * strC를 나중에 추가해야하는 경우 strings.cpp에 extern 선언과 정의를 추가하고 C.cpp에서 다시 선언하고 A.cpp B.cpp는 다시 컴파일 할 필요가 없습니다.

이 접근법의 단점은 코드 중복입니다. 변수를 한 번 선언하고 선언을 포함하는 대신 모든 변수를 어디에서나 선언하고 사용해야합니다. 그 문제는 변수의 이름을 바꾸기로 결정한 경우 여러 위치에서 이름을 바꾸어야한다는 것입니다. 그런데 다시 변수 이름을 바꾸면 어쨌든 선언이 포함되어 있어도 어쨌든 그것을 사용하는 모든 파일을 수정해야합니다. 그리고 어쨌든 전역 이름 바꾸기 만 할 수 있습니다.

여러 소스 파일을 다시 컴파일 할 때 비용에 영향을주지 않는 변경 사항은 변경 될 수도 있고 수정하지 않을 수도있는 변수의 이름 바꾸기 비용보다 훨씬 커질 수 있습니다. 그러나 아직 언급 된 선언 헤더의 단점을 본 적이 없습니다.

누락 된 항목이 있습니까?

답변

1

문자열을 변경하면 해당 파일 하나만 다시 컴파일하면됩니다. 문자열을 추가하는 데는 비용이 많이 들지만 문자열을 수정하는 것은 매우 저렴합니다. 다른 이점은 모든 문자열이 한 곳에 있다는 것입니다. 하나를 변경하고 싶다면 많은 파일을 검색하지 않아도되고 프로그램을 번역하고 싶을 때 더 쉽게 할 수 있습니다.

프로젝트 전체에 많은 문자열이 분산되어있는 경우 동일한 머리글에 모든 문자열을 포함하지 말고 그룹화하십시오. 또한 그 중 하나를 사용하지 않는다면 해당 헤더를 포함하지 마십시오.

+0

나는 모든 문자열을 함께 유지합니다. 그것이 내가 결국 제안한 것입니다. 방금 헤더를 없애고 파일에 extern 변수를 선언하고 문자열 정의를 하나의 파일로 유지하도록 요청했습니다. 문자열 추가 및 수정이 모두 저렴하다는 것을 의미합니다. 그래서 strings.hpp와 strings.cpp 대신에 strings.cpp 만 있습니다. – Kian

1

여러 파일에 같은 헤더를 포함 시키면 식별자를 사용하는 모든 소스 파일에서 동일한 선언을 볼 수 있습니다. 이렇게하면 오류가 줄어 듭니다. 다양한 소스 파일에 사용되는 사용되지 않는 선언의 다양한 서브 세트가 있다면

후 선언, B.h, A.h 여러 헤더에 C.h 분할 될 수 있고, 각각 헤더 만 소스 파일을 포함 할 것이다 그것의 선언을 사용하십시오. 그런 다음 B.h에서 선언을 변경하면 A.h 또는 C.h을 포함하지만 B.h이 아닌 소스 파일은 다시 컴파일 할 필요가 없습니다.

때때로 헤더에서 선언이 변경되어 변경된 선언이 아닌 헤더를 사용하는 소스 파일이 컴파일되기 때문에 불필요한 재 컴파일이 필요합니다. 이것은 일반적으로 중복 된 코드로 인해 발생하는 오류 및 복잡성을 피하기위한 작은 비용으로 간주됩니다.

관련 문제