문제

나는 매우 큰 규모의 시스템을 사용했고 필요한 순서를 본 적이 없지만 최근에 그것을 발견했습니다. STL 또는 STD 라이브러리 또는 부스트에 특정 포함이 특정 순서로 제공되어야하는 경우가 있습니까?

도움이 되었습니까?

해결책

STL 또는 STD 라이브러리 또는 부스트에 특정 포함이 특정 순서로 제공되어야하는 경우가 있습니까?

표준의 경우 대답은 강조합니다. 아니요. 나는 그것을 찾지 못했지만 부스트도 마찬가지라고 생각합니다.

C 표준에서 :

표준 헤더는 어떤 순서로도 포함될 수 있습니다. 각각의 영향을 제외하고는 주어진 범위에 한 번 이상 포함될 수 있습니다. <assert.h> 정의에 따라 다릅니다 NDEBUG (7.2 참조).

C ++ 표준은 비슷한 문구를 가지고 있습니다.

제가 선호하는 것은 헤더에 자체 의존성이 포함되어야하지만, 나는 이것이 '낭비라고 믿는 사람들과 함께 일했습니다. 내 생각에, 헤더가 없으면 종속성이 포함되어 있지 않은 것은 쓸모없는 초기 최적화입니다.

다른 팁

이것은 확실히 나쁜 디자인처럼 들립니다. 어떻게 든 특정 명령이 필요한 경우 도서관은 하나 다른 것들을 포함하는 헤더 옳은 주문하다.

부스트와 STL에 관한 한, 나는 아직이 상황을 발견하지 못했다고 확신합니다.

특정 순서로 포함하도록 지정 해야하는 것은 거의 항상 설계 문제를 나타냅니다. 우연히이 작업을 수행 할 가능성을 줄이는 한 가지 방법은 클래스 헤더 파일을 구현 파일의 첫 번째 #include로 포함하는 연습을하는 것입니다.

// A.cpp
#include "A.h"
#include "boost/shared_ptr.hpp"
#include <vector>

class A {
// ...
};

예를 들어, AH가 올바른 #include없이 벡터를 사용하는 경우 A.CPP는 컴파일하지 않습니다.

나는 내가 이것을 어디에서 뽑았는지 기억이 나지 않는다. Lakos (실제로 업데이트를 사용할 수있는 훌륭한 책)의 "대규모 C ++ 디자인"에서 나왔을 수도 있습니다.

STL 또는 STD 라이브러리 또는 부스트에 특정 포함이 특정 순서로 제공되어야하는 경우가 있습니까?

나는 이것을 발견 한 적이 없으며 그것이 그렇다면 저자에게 최대한 빨리 통보되어야합니다. 그리고 오, 그렇습니다. 그것은 매우 나쁜 디자인입니다.

프로젝트 레벨 호환성 헤더 (compat.h)를 첫 번째 __stdc_limit_macros, __reentrant 및 기타 프로젝트 와이드 매크로와 같은 필요한 매크로를 정의하는 .c/.cpp 소스 파일의 헤더. 표준 헤더의 후속 동작에 영향을 미칩니다.

나는 오래 전에 내부 라이브러리의 유능한 프로그래머 가이 사용을 처음 보았습니다. 나중에 나는 'git'(악명 높은 DVC) 프로젝트 가이 기술을 사용하는 것을 보았습니다.

그것은 '나쁜 것'입니다. 더 나은 방법이 언급되었습니다. 그러나 나는 정교 할 것이다.

//a.h
#ifndef _A_H_
#define _A_H_

//... code ...

#endif
// -----------------
//b.h
#ifndef _B_H_
#define _B_H_
#include a.h

//... code ...

#endif
// -----------------
//main.cpp Try 1
#include "b.h" //<- okay!  b includes a, then does b
// -----------------
//main.cpp Try 2
#include "a.h" //<- includes a
#include "b.h" //<- okay!  b includes a, but skips redefining it, then does b
// -----------------
//main.cpp Try 3
#include "b.h" //<- b includes a, then does b
#include "a.h" //<- okay!  a skips redefining itself!
// -----------------
//main.cpp Try 4
#include "a.h" //<- fail!  b is not included anywhere =(

헤더 (예 : AH)에 포함 된 함수 및/또는 클래스가 다른 헤더 (예 : BH)에 정의 된 함수 및/또는 클래스에 의존하는 경우 첫 번째 사용자를 강제하기 위해 후자를 포함하는 것이 좋습니다. 하나는 특정 순서로 둘 다 포함해야합니다.

예:

// A.h
#pragma once
// or the #ifndef trick
#include "B.h"

// A.cpp
#include "A.h"

아니:

// A.h
#pragma once
// or the #ifndef trick
//#include "B.h"

// A.cpp
#include "B.h"
#include "A.h"

나는 알파벳 순서로 헤더를 포함하는 것을 좋아합니다. 이미 한 일을 쉽게 볼 수 있습니다.

lib가 잘못된 순서이기 때문에 작동하지 않으면 깨지고 주문 독립적으로 고정되어야합니다.

나에게는 불행히도 소켓/socket2가 포함 된 Win32 API에있는 것이 좋지 않은 디자인입니다. 결과적으로 포함 순서의 오류는 아무데도 나오지 않는 일련의 오류가 트리거되며 종속성이 정의를 변경하는 경우 코드가 여전히 컴파일되는 경우 디버깅하기 어려울 수 있습니다.

다른 경우에는 여전히 문제가 발생합니다. YH에 이미 포함되어 있기 때문에 헤더 XH를 포함하지 않으면 코드는 XH에 대한 YH 의존성에 의존합니다. 나중에 YH가 리팩토링되고 더 이상 YH가 필요하지 않으면 포함 내용을 제거하면 코드 기반이 나옵니다. 이것은 커플 링의 부호입니다 (클래스 수준이 아닌 경우에도) : 코드 기반의 한 부분의 변경은 다른 코드의 다른 부분으로 전파하고 확장해야합니다.

아마도 당신이 MFC를 사용하고 있다는 신호 일 것입니다. 결국 불량 디자인을 나타낼 수 있습니다 (농담 ... 또는 그것은?)

(적어도 MFC를 마지막으로 보았을 때, 당신이 포함 된 곳은 정말 까다 롭습니다. <windows.h>)

내 지식이 아닙니다. 꽤 나쁜 연습입니다. 그래도 최근 내 코드에서 Windows 헤더와 이상한 인터페이스를 사용하여 실행됩니다.

가드와 포워드 선언을 포함시켜야합니다. 따라서 헤더를 포함하는 순서에 많은 문제가 없어야합니다.

때로는 헤더가 먼저 또는 마지막으로 포함되어 있어야하는데, 왜 그런지 모르겠습니다.
(예 : 소스 SDK에서)

예, C ++에 포함 된 특정 주문이 필요한 것은 잘못된 라이브러리/헤더 디자인의 표시입니다.

전달 선언은 클래스를 완전히 사용하기 위해 둘 이상의 파일을 포함해야 할 수도 있습니다. 아래 예를 참조하십시오 :

// 아

class B; // forward declaration

class A
{
    void doStuff(const B& b);
};

// main.cpp

#include <A.h>
#include <B.h>

int main()
{
    A a;
    B b;
    a.doStuff(b);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top