오류찾아보기 #1
글쓴이: 익명 사용자 / 작성시간: 토, 2003/06/21 - 9:17오후
이 소스에 대한 오류를 찾아보세요. 재미있을거예요. :)
그리고 원인 파악하셨으면 뒷글 달아주세요.
헤더를 어떠게 참조하는지 보시면 힌트가 될겁니다.
분명 이것은 컴파일의 명백한 오류코드입니다.
그리고 이러한 문제가 발생했을때 여러분들은 어떻게 그것을 해결하고 계시는지요? (무지 궁굼함.)
========= [ 헤더 : a.h ]================= #if !defined(__a_h__) #define __a_h__ #include "b.h" typedef struct { t_b ItB; int IsA; }t_a; extern void FunctionA(t_a *s_a); #endif
========= [ 헤더 : b.h ]================= #if !defined(__b_h__) #define __b_h__ #include "a.h" typedef struct { t_b ItA; int IsB; }t_b; extern void FunctionB(t_b *s_b); #endif
========= [ 소스 : a.c ]================= #include "a.h" void FunctionA(t_a *s_a) { s_a->IsA = 'A'; }
========= [ 소스 : b.c ]================= #include "b.h" void FunctionB(t_b *s_b) { s_b->IsB = 'B'; }
========= [ 소스 : main.c ]============== #include <stdio.h> #include "a.h" #include "b.h" int main(void) { t_a s_a; t_b s_b; FunctionA(&s_a); FunctionB(&s_b); fprintf(stdout, "s_a->IsA = %c, s_b->IsB = %c\n", s_a->IsA, s_b->IsB); return(0); }
========= [ Make : Makefile ]============== all: test clean: $(RM) test test: main.c a.c b.c gcc -I. -s -O2 -Wall -Werror -o $@ $^[/code]
Forums:
Re: 오류찾아보기 #1
t_b가 재귀적으로 선언되어 있네요.
모든 문제의 원인은 다음 한 가지 사실에서 연유합니다.- 구조체의
모든 문제의 원인은 다음 한 가지 사실에서 연유합니다.
- 구조체의 멤버는 데이터형으로 incomplete type 을 가질 수 없다
(물론, C99 에 새로 추가된 flexible array member 는 적법한 예외입니다)
전형적인 자기 참조 혹은 상호 참조 구조체를 구현하는 방법을 사용할 수
밖에 없습니다. (IT 백두대간 C 언어, pp.604-608, pp.639-643)
두 헤더가 서로 connection 을 가짐에도 분리하여 다루고 있는 디자인 상의
문제는 차치하고라도, 이식성을 고려하고 있으면서 해당 프로그램이 특정
implementation 의 일부를 구성하는 것이 아니라면, 가능한 implementer 에
게 예약된 형태의 명칭 (__a_h__ 등) 을 사용하지 않는 것이 좋습니다. 그
러한 명칭을 사용하는 것만으로도 C 표준은 해당 프로그램의 이식성을 보장
하지 않습니다. 유사한 이유로 밑줄과 대문자로 시작하는 명칭도 모든 문맥
에서 implementer 에게 예약되어 있으며, 밑줄과 소문자로 시작하는 명칭은
일부 문맥에서 사용자에게 허락되지만 매크로 명칭으로 정의하는 것은 역시
나 허락되지 않습니다. (IT 백두대간 C 언어, p.982)
p.s. 개인적으로 이와 같은 퀴즈 형태의 글이 Q&A 에 적절한지는 모르겠습
니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
Re: 오류찾아보기 #1
저는 -E 나 -save-temps 를 넣어 출력되는 pre-processed file을 확인합니다.
---
http://coolengineer.com
댓글 달기