[완료]include 순서에대한 질문입니다.

copower의 이미지

안녕하세요.
매번 많은 지식을 얻어가고 있는 초보자입니다.
오늘은 생각지도 않았던 include 순서에대한 문제에대해서 질문글을 올립니다...

main.cpp

 
// 아래가 선언 순서가 문제가 되는 부분입니다.
#include "Book_LinkedList.h"
#include "User_LinkedList.h"
 
int main()
{
 // 이런 부분 저런부분...
}

User_LinkedList.h

 
// ... 다른 구조체 선언 부분
 
typedef struct U_LINKEDLIST 
{
	int nTotalUser;
	struct U_NODE *pUserHead;
}userlinkedlist;
 
// ...이런 함수 저런 함수 선언부분

Book_LinkedList.h

 
// ... 다른 구조체 선언 부분
 
typedef struct B_LINKEDLIST 
{
	int nTotalBook;
	struct B_NODE *pBookHead;
}booklinkedlist;
 
// ...이런 함수 저런 함수 선언부분
 
 
// 아래 두 함수가 문제의 함수
// 아래와 같이 하면 정상적으로 컴파일도 되고 기능도 동작합니다.
int LendBook(booklinkedlist*, struct U_LINKEDLIST*);
int ReturnBook(booklinkedlist*, struct U_LINKEDLIST*);
 
// 아래와 같이 하면 구조체 변수명으로 변경해버리면 #include 순서 문제로 컴파일에서부터 다음과 같은 에러를 마구 뿜어냅니다.
// error C2061: 구문 오류 : 식별자 'userlinkedlist'
// error C2660: 'LendBook' : 함수는 2개의 매개 변수를 사용하지 않습니다.
// error C2660: 'ReturnBook' : 함수는 2개의 매개 변수를 사용하지 않습니다.
int LendBook(booklinkedlist*, userlinkedlist*);
int ReturnBook(booklinkedlist*, userlinkedlist*);

사실 전자와 같이 사용하면 돌아가긴 하는데... 역시 함수 파라미터가 동일 하지 않은 것이 마음에 걸립니다.
그렇다고 메인 에서 헤더의 include 순서를 변경해버리면 역시 booklinkedlist의 구문 오류가 발생합니다.
무엇을 먼저 선언해도 답이 안나온 이 상황... -> 사실 근본적으로는 제가 잘못 설계해서 이러한 문제가 발생한것은 알고있습니다 :)
하지만 어떻게든 고쳐보고 싶어서 끙끙되고 있습니다...

다른 방법으로 시도해 본것은...
저 두함수만을 위한 .h와 .cpp를 만들어서 때려 넣어버렸습니다 :(
하지만 역시 이방법도.... 근본적인 해결 방법은 아닌것 같습니다.

어떻게 해결 해야할까요???
해결 방향이라도 알려주시면 열심히 연구해 보겠습니다 :)

익명 사용자의 이미지


main.cpp인걸 봐서는 c++같네요. 그러면 전방선언으로 해결이 가능할 듯 합니다.
일단 typedef struct 대신 그냥 struct로 선언하시는게 좋을듯하구요.

User_LinkedList.h 에는..
....
struct userlinkedlist
{
int nTotalUser;
struct U_NODE *pUserHead;
};

struct booklinkedlist;
...

Book_LinkedList.h 에서는
...
struct booklinkedlist
{
int nTotalBook;
struct B_NODE *pBookHead;
};

struct userlinkedlist;
...

로 하시면 include 순서 상관없이 사용 가능합니다.

copower의 이미지

어이쿠 제가 생각을 잘못 한 부분이 있네요...
c++이 아니라 C로 구현한 프로그램이거든요....(사실, C++에서만 사용되는 구문이 들어가있을수도 있는데 이것을 구분 할 수 있는 실력은 아니네요...)

maic.c로 작성해야하는데, vs2010에서 다짜고짜 cpp로 만드는 바람에 이런 문제가 생겼네요...
말씀해주신대로 적용 했지만, typedef struct 구조체명 {...} 변수명; 으로 이미 변수면을 사용한 곳이 많아서...
어떻게 고쳐야 할지 난감하네요. 애시당초 잘 모르는 typedef struct를 쓰지 말았어야하는게 아닌가 합니다........

copower의 이미지

제가 본문을 제대로 읽어 보지 않고 해매고 있었군요...
말씀해주신대로 처리하였더니 해결되었습니다 :)
전방 선언이라는 기법에 대해서 공부 할 수있는 기회가 되었네요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.