오류찾아보기 #1

익명 사용자의 이미지

이 소스에 대한 오류를 찾아보세요. 재미있을거예요. :)
그리고 원인 파악하셨으면 뒷글 달아주세요.
헤더를 어떠게 참조하는지 보시면 힌트가 될겁니다.

분명 이것은 컴파일의 명백한 오류코드입니다.
그리고 이러한 문제가 발생했을때 여러분들은 어떻게 그것을 해결하고 계시는지요? (무지 궁굼함.)

========= [ 헤더 : 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]
cdpark의 이미지

minzkn wrote:
이 소스에 대한 오류를 찾아보세요. 재미있을거예요. :)
그리고 원인 파악하셨으면 뒷글 달아주세요.
헤더를 어떠게 참조하는지 보시면 힌트가 될겁니다.
========= [ 헤더 : 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 

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

pynoos의 이미지

minzkn wrote:
분명 이것은 컴파일의 명백한 오류코드입니다.
그리고 이러한 문제가 발생했을때 여러분들은 어떻게 그것을 해결하고 계시는지요? (무지 궁굼함.)

저는 -E 나 -save-temps 를 넣어 출력되는 pre-processed file을 확인합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.