C언어, 소스 사이에서 호환되는 구조체

gurumong의 이미지

구조체 정의는 항상 새로운 타입을 만들어 낸다고 배웠습니다
그런데 책에서 ADT라고 설명하는 부분을 읽다가 전혀 이해가 되질 않는 부분이 있는데요

두 소스파일 모두에게 인쿨루드되는 헤더파일 내부에 있는
typedef struct foo *foo_t;
이 코드는 사용자 정의형을 선언하는것인데
불완전형 구조체 정의까지 포함하고있는데요

소스 "사용자 프로그램" 에서는 이것이 그대로 불완전형으로 남게되지만
소스 "라이브러리 본체" 에서는 이것이 이후에 따라오는 구조체 선언에 의해서 완전한 형이 되는데
이것은 각각의 소스에서 따로 선언된 서로 다른 구조체형이 되는것이 아닌가요?

프로그램 소스 사이에서 구조체형이 호환되기 위해서는
같은 개수의 맴버를 갖고
맴버를 같은 순서로 선언하고
대응하는 맴버는 같은 명칭을 갖고
대응하는 맴버는 호환되는 데이터형을 갖고
대응하는 ㅐㅁ버가 비트 필드인 경우, 같은 크기를 갖고
같은 택명칭을 갖거나 둘다 택명칭이 없어야하는데
이것에 해당되지 않잖아요
그러니까 서로 호환되지 않는 구조체에 대한 포인터가 사용된것이 아닌가요?

C언어가 포인터가 제일 어려운줄 알았는데, 이제보니 구조체인거 같네요

/* 라이브러리 헤더파일 */
typedef struct foo *foo_t;
int func(foo_t p);

/* 라이브러리 본체 */
#include ...
 
struct foo {
    /* 맴버 선언 */
};
 
int func(foo_t p)
{
    /* 함수 본체 */
}

/* 사용자 프로그램 */
#include ...
 
foo_t use;
result = func(use);

cppig1995의 이미지

같은 tag 이름을 갖잖습니까.
라이브러리 헤더 파일에서 저렇게 정의하고 있는 건 결국 라이브러리 소스 파일에서
foo_t를 정의한 후 struct foo를 정의하는 형태가 되고, 사용자 프로그램에서는 foo_t를 정의하는 형태가 되죠.

조금 헷갈리긴 하지만, stdio.h FILE과 비슷한 형태인 것 같습니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

gamdora의 이미지

Quote:

C언어가 포인터가 제일 어려운줄 알았는데, 이제보니 구조체인거 같네요

어허허, 구조체 포인터는 어떨까요~?

댓글 달기

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