2012-02-28 4 views
2

좋은 하루!시스템 헤더에서 나머지 세계를 보호

현재 시스템 종속 헤더 파일에서 프로그램의 나머지 부분을 보호하는 "방법"을 찾고 있습니다. 시스템 헤더 자체의 종속성으로 인해 세부 네임 스페이스에 넣을 수없는 경우가 많습니다. 이제는 세부 네임 스페이스 내에서 extern 선언 된 변수를 사용하고 시스템 헤더가 포함 된 .cpp 파일 내 값을 지정했습니다. 외부 세계는 대부분의 것을 알지 못하기 때문에 이것은 완벽한 솔루션 인 것처럼 보였습니다. 그리고 여러분이 필요로하는 것은 모두 세부 네임 스페이스에 묶을 수 있습니다. 그러나 한 가지 문제가 있습니다. extern 상수를 사용하여 enum 상수를 초기화 할 수 없습니다.

내 질문 : exum 변수에 enum/struct 유형을 사용하는 방법이 있습니까? 아니면 시스템 헤더에서 프로그램을 보호하는 더 좋은 방법이 있습니까?

VS11은 말한다 :

namespace detail 
{ 
    extern const int value; 
} 

const auto val = detail::value; // ok 

enum class my_enum 
{ 
    value = detail::value, // "expression must have a constant value" 
}; 

struct my_struct 
{ 
    static const auto value = detail::value; // "constant value is not known" 
}; 

답변

1

나는 당신이 달성 하려는지 잘 모르겠지만, 당신은 시스템 헤더에 대한 종속성을 이전 것과 동일한 값을 가질 수있는 새로운 상수를 재정의하려는 경우 유지된다.

내가 의존성을 제거하는 첫 번째 방법은 각 기능에 대한 자신의 상수를 사용하여 자체 래퍼에서 시스템 헤더 기능을 다시 정의하는 것입니다 (원하는 경우 열거 형이 될 수 있음). 일반 상수 헤더 자체에이 정의 됨). 그런 다음 구현 파일에서 시스템 헤더를 포함하고 상수의 값을 시스템 헤더의 값으로 다시 매핑하십시오.

+0

종속성이 유지됩니다. 그러나 과 같은 헤더에는 나머지 프로그램에서 실제로 원하지 않는 것들이 포함됩니다. (예 : "max"라는 매크로는 std :: max를 사용할 수 없음) -하지만 모든 값을 다시 매핑 할 수 있습니다. 아무도 더 좋은 생각이 없다면 나는 이것을 답으로 표시 할 것입니다. – cooky451

+0

windows.h를 포함하기 전에'max'는'#define NOMINMAX'로 해결할 수 있습니다. "희박하고 의미있는"정의를 사용할 수도 있습니다. –

관련 문제