구조체의 define 문이 어떻게 작용하는지요?

trymp의 이미지

제가 커널 라우팅 관련 코드를 보는데요

아래 구조체 에서 define 문이 있는데,

fib_mtu 이게 구조체 필드로 들어가는 건가요?

아님 그냥 매크로로 선언되어 있고 구조체 필드에는 안 들어가는지?

제가 햇갈리네요.

아시는 분 도움 좀 부탁드립니다.

struct fib_info {
	struct hlist_node	fib_hash;
	struct hlist_node	fib_lhash;
	int			fib_treeref;
	atomic_t		fib_clntref;
	int			fib_dead;
	unsigned		fib_flags;
	int			fib_protocol;
	__be32			fib_prefsrc;
	u32			fib_priority;
	u32			fib_metrics[RTAX_MAX];
#define fib_mtu fib_metrics[RTAX_MTU-1]
#define fib_window fib_metrics[RTAX_WINDOW-1]
#define fib_rtt fib_metrics[RTAX_RTT-1]
#define fib_advmss fib_metrics[RTAX_ADVMSS-1]
	int			fib_nhs;
#ifdef CONFIG_IP_ROUTE_MULTIPATH
	int			fib_power;
#endif
	struct fib_nh		fib_nh[0];
#define fib_dev		fib_nh[0].nh_dev
};

ihavnoth의 이미지

구조체 필드라고 표현할 수 있을지

일반적인 구조체 필드랑 어떻게 다른지

표준인지 gcc 지원인지는 모르겠습니다.(그러니 참고만 하세요)

하지만 써보니 가독성과 접근 편의성이 상당히 좋네요

fib 정보 중 fib_metrics 배열은 다른 곳과 자료 교환을 위해서 유지해야하니 그대로 두고

그 배열의 인덱스 중 필요한 정보에 대해서 구조체 내에서 #define을 해서 접근하니

많이 편하네요

예를 들어 mtu 정보라면

fib_info.fib_metrics[mtu인덱스]로 접근하는 것보다

fib_info.fib_mtu로 접근하는 것이 훨씬 인간적인 표현 같습니다.

없음

klara의 이미지

당연히 안들어갑니다.
#문은 최종 소스 코드에서는 전부 사라집니다. 그냥 구조체 멤버중에 의미있는 부분을 별도의 이름으로 정의했을 뿐입니다.

struct fib_info info; info.fib_mtu;

가 컴파일이 되는 이유는 fib_mtu가 info의 멤버로 들어가기 때문이 아니라, fib_mtu가 define 된대로 치환되어 fib_metrics[RTAX_MTU-1]로 바뀌기 때문입니다.
일반적인 define문과 완전히 동일합니다.

ihavnoth의 이미지

gcc -E 옵션 사용하니 쉽게 확인 가능하네요

없음

익명 사용자의 이미지

딱히 구조체와 관련이 있는 표현이 아니라 그냥 매크로입니다.

#include <stdio.h>
 
struct foo {
    int a[10];
    #define end a[9]
};
 
int main(void) {
    struct foo b;
    int a[10];
    int i;
    for(i = 0; i < 10; i++) {
        b.a[i] = i + 10;
        a[i] = i;
    }
    printf("%d %d\n", end, b.end);
    return 0;
}