C/C++ 에서 헤더파일 include 순서와 함수 정의 순서는 어떻게 하세요?

trymp의 이미지

C/C++ 을 계속 프로그래밍 했었는데, 만들다보면 헤더 순서가 꼬이는 경우가 생깁니다.

가령 aa.h 의 class 나 struct 가 bb.h 를 참조하고
bb.h 의 class 나 struct 가 aa.h 를 참조하고 이렇게 서로 참조하면 꼬이는데요.ㅠ
이런 경우 짜증이 많이 나더라구요.
다른분들 헤더 include 순서를 어떻게 잡으시는지 궁금합니다.

그리고 함수 같은 것을 정의 할때 순서가 따로 있으신가요?
callee 보다 caller 를 항상 아래에 놓으시나요?
별로 생각하지 않고 있다가 좀 궁금해지내요.

기준이나 노하우가 있으신 분들 좀 알려주시면 감사하겠습니다.

HDNua의 이미지

class A와 class B 사이에 인터페이스를 만듭니다.

////////////////////////////////////////////////
// A.h
class A {
 int value;
public:
 // put method here
}
////////////////////////////////////////////////
// B.h
class B {
 int value;
public:
 // put method here
}
 
////////////////////////////////////////////////
// ABInterface.h
#include "A.h"
#include "B.h"
 
// make interface function
int function(A &a, B &b);
 
// make interface class
class ABManager {
public:
 int method(A &a, B &b);
}

이후 ABInterface.h만 포함하여 쓰면 A 헤더와 B 헤더의 순서를 생각할 일이 줄어듭니다.

저는 이렇게 생각했습니다.

twinwings의 이미지

객체(struct든 class든)를 pointer로 참조를 한다면

전방선언으로 충분합니다. 헤더 순서도 물론 관계 없구요.

in a.h

/* 구조체 b에 대한 전방선언 */
typedef struct _b_s b_s;
 
typedef struct _a_s
{
    b_s* b;
    ....
} a_s;

in b.h

/* 구조체 a에 대한 전방선언 */
typedef struct _a_s a_s;
 
typedef struct _b_s
{
    a_s* a;
    ....
} a_s;

서로가 서로에 대해서 참조하고있어도 전혀 문제가 없는 코드죠.

trymp의 이미지

두분 정말 감사합니다..ㅎㅎ