코드에 단일 헤더 요구 사항이 있습니다. 즉, 선언과 정의가 별도의 헤더와 소스 파일로 분리되지 않아야합니다. 나는 올바르게 구현했고,이 헤더 파일은 단일 소스 파일에만 포함되도록 의도 된 나의 사용 사례를 위해 의도 된대로 작동합니다.단일 헤더에 대한 변수의 재정의를 피합니다.
여러 개의 소스 파일 (두 개 이상의 .cpp에 포함되어 있음)에서 사용할 때 일부 변수가 다시 선언되는 줄에 따라 링커 오류로 인해 실패합니다. 그건 내가 같은 코드했습니다 때문입니다 -
#ifndef HEADER_HPP
#define HEADER_HPP
....
std::streambuf const *R_coutbuf = std::cout.rdbuf();
std::streambuf const *R_cerrbuf = std::cerr.rdbuf();
std::streambuf const *R_clogbuf = std::clog.rdbuf();
void doSomething(){
[uses if(R_coutbuf) and others]
}
....
#endif HEADER_HPP
지금 가장 좋은 방법은 헤더 파일에서 그 바르를 선언하고 정의/하나의 cpp 파일에 할당하는 것입니다,하지만 난 할 수 있도록하려는 말했듯 이 작업은 단일 헤더 파일로 수행하십시오. 어떤 소스 파일에 여러 개의 파일이 포함되면 재 선언이 생기는 문제가 발생합니다.
지금까지 내가이 일을 할 수 있어야하는 방법을 잘 모르겠어요하지만이 개 아이디어했습니다 - 나는 그것에 대해 확실하지 않다
#ifdef DEFINE_VARIABLES
#define EXTERN /* nothing */
#else
#define EXTERN extern int
#endif /* DEFINE_VARIABLES */
EXTERN global_variable = something;
을,이 경우에도 작동합니다?
#ifndef HEADER_HPP
#define HEADER_HPP
....
namespace R {
namespace {
std::streambuf const *R_coutbuf = std::cout.rdbuf();
std::streambuf const *R_cerrbuf = std::cerr.rdbuf();
std::streambuf const *R_clogbuf = std::clog.rdbuf();
}
void doSomething(){
[uses if(R_coutbuf) and others]
}
}
....
#endif HEADER_HPP
내가이를 수있는 다른 방법이 있나요 -
그리고 내가 생각 두 번째 방법은 익명의 공간에 넣어하는 것입니다,이 성공적으로 지금까지의 건물을 시도하고있다? 위에서 설명한 방법 중 하나에 문제가 있습니까?
당신이 뭔가 "작동"인지 확실하지 않은 경우, 또는하지, 더 빨리 단지에 일을하려고 할 것입니다 보인다 intertubes에있는 누군가가 당신을 위해 그것을 알아낼 때까지 기다리는 대신에,보십시오. –
_header.hpp_를 포함하여 __before__ 하나의 _.cpp_ 파일에서 __exactly__ 하나의 매크로를 정의하는 한'DEFINE_VARIABLES'/참고 :'int' 이외의 변수가 필요할 수도 있으므로 정의를'#define EXTERN extern'으로 변경하십시오. – CristiFati
흥미로운 질문이지만 ... 원한다면 cpp 파일에 헤더 파일을 포함시켜야합니다 ... 왜 헤더 파일을 없애고 그 내용을 cpp 파일의 초기 부분에 쓰지 않습니까? – max66