구조체의 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 옵션 사용하니 쉽게 확인 가능하네요
없음
딱히 구조체와 관련이 있는 표현이 아니라 그냥
딱히 구조체와 관련이 있는 표현이 아니라 그냥 매크로입니다.
#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; }댓글 달기