Rust의 C++대비 장점중 하나가 헤더 인클루드 복잡도가 O(n^2)가 아니라 O(n)인 점이란 이야기를 듣고 (크게 관계는 없지만) 생각난 것:
일단 각 헤더의 타 헤더 인클루드는 self-contained하게 해야 한다고 생각하는데. 컴파일러마다 어떤 순서로 헤더들을 파싱하느냐가 달라질 수 있어서 이걸 잡아내기 어려울때가 있다. 가끔 한 컴파일러에서 빌드가 잘 되다가도 다른 컴파일러에서는 필요한 헤더가 참조가 안되었다고 하는 경우가 이것
아무튼 지금까지는 헤더를 관계상 가장 먼것에서 가까운 것으로 정렬했었는데 그 반대로 하는게 도움이 된다는걸 알게됨.
예를 들어 어떤 헤더가 #include <vector> #include <same_proj/a.hpp>
이렇게 한 경우 a.hpp에서 <vector>가 필요하지만 인클루드 하지 않아도 컴파일이 될 수도 있음.
이런 우연을 제거하려면 항상 #include <same_proj/a.hpp> #include <vector>
이런 식으로 가까운것에서 먼것으로
그래서 내가 쓰는 정렬: 0. 같은 프로젝트 private header 1. 같은 플로젝트 public header (이 안에서도 target의 dependency 역순으로) 2. 3rd-party 3. C++ STL 4. C system
이것도 최신 ClangFormat의 IncludeCategories를 잘 주무르면 자동정렬 가능! clang.llvm.org/docs/ClangForm…
• • •
Missing some Tweet in this thread? You can try to
force a refresh