구조체의 define 문이 어떻게 작용하는지요?
글쓴이: trymp / 작성시간: 일, 2013/07/21 - 7:22오전
제가 커널 라우팅 관련 코드를 보는데요
아래 구조체 에서 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 };
Forums:
구조체 필드처럼 접근이 가능하네요
구조체 필드라고 표현할 수 있을지
일반적인 구조체 필드랑 어떻게 다른지
표준인지 gcc 지원인지는 모르겠습니다.(그러니 참고만 하세요)
하지만 써보니 가독성과 접근 편의성이 상당히 좋네요
fib 정보 중 fib_metrics 배열은 다른 곳과 자료 교환을 위해서 유지해야하니 그대로 두고
그 배열의 인덱스 중 필요한 정보에 대해서 구조체 내에서 #define을 해서 접근하니
많이 편하네요
예를 들어 mtu 정보라면
fib_info.fib_metrics[mtu인덱스]로 접근하는 것보다
fib_info.fib_mtu로 접근하는 것이 훨씬 인간적인 표현 같습니다.
없음
당연히 안들어갑니다.#문은 최종 소스 코드에서는
당연히 안들어갑니다.
#문은 최종 소스 코드에서는 전부 사라집니다. 그냥 구조체 멤버중에 의미있는 부분을 별도의 이름으로 정의했을 뿐입니다.
struct fib_info info; info.fib_mtu;
가 컴파일이 되는 이유는 fib_mtu가 info의 멤버로 들어가기 때문이 아니라, fib_mtu가 define 된대로 치환되어 fib_metrics[RTAX_MTU-1]로 바뀌기 때문입니다.
일반적인 define문과 완전히 동일합니다.
gcc -E 옵션 사용하니 쉽게 확인 가능하네요
gcc -E 옵션 사용하니 쉽게 확인 가능하네요
없음
딱히 구조체와 관련이 있는 표현이 아니라 그냥
딱히 구조체와 관련이 있는 표현이 아니라 그냥 매크로입니다.
댓글 달기