>
이 예에서 Book 의 전체 정의   main() 에서 사용하기 전에 . Book 를 선언하는 방법이 있습니까  세부 사항을 지정하지 않고 유형으로, main() 이후 세부 사항을 정의하십시오. . 감사합니다.

https://www.tutorialspoint.com/cprogramming/c_typedef.htm 을

#include <stdio.h>
#include <string.h>
typedef struct Books {
   char title[50];
   char author[50];
   char subject[100];
   int book_id;
} Book;
int main( ) {
   Book book;
   strcpy( book.title, "C Programming");
   strcpy( book.author, "Nuha Ali"); 
   strcpy( book.subject, "C Programming Tutorial");
   book.book_id = 6495407;
   printf( "Book title : %s\n", book.title);
   printf( "Book author : %s\n", book.author);
   printf( "Book subject : %s\n", book.subject);
   printf( "Book book_id : %d\n", book.book_id);
   return 0;
}

  • 답변 # 1

    선언하고 전달할 수 있습니다.

    typedef struct Books Book;
    
    

    Book* 타입의 포인터를 사용할 수 있습니다. 하지만 * 와 상관없이 역 참조를 허용하지 않습니다.  또는 -> ) 또는이 유형의 객체를 선언합니다 ( Book book; 와 동일) ).

    명시된 목표를 달성하는 데 가장 가까운 것은 아마도 할당 된 Book 에 대한 포인터를 반환하는 함수  그런 다음 접근 자 기능을 사용합니다.

    이 컴파일 :

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct Books Book; //forward declare + typedef
    Book *Book__alloc(void);
    //accessor functions:
    char*Book__title(Book*);
    char*Book__author(Book*);
    char*Book__subject(Book*);
    int *Book__id(Book*);
    
    int main( ) {
       Book *book = Book__alloc();
       if(!book) return EXIT_FAILURE;
       strcpy( Book__title(book), "C Programming");
       strcpy( Book__author(book), "Nuha Ali"); 
       strcpy( Book__subject(book), "C Programming Tutorial");
       *Book__id(book) = 6495407;
       printf( "Book title : %s\n", Book__title(book));
       printf( "Book author : %s\n", Book__author(book));
       printf( "Book subject : %s\n", Book__subject(book));
       printf( "Book book_id : %d\n", *Book__id(book));
       free(book);
       return 0;
    }
    //provide definitions after the fact
    struct Books {
       char title[50];
       char author[50];
       char subject[100];
       int book_id;
    };
    Book *Book__alloc(void){ return malloc(sizeof(Book)); }
    char*Book__title(Book*X){ return X->title; }
    char*Book__author(Book*X){ return X->author; }
    char*Book__subject(Book*X){ return X->subject; }
    int *Book__id(Book*X) { return &X->book_id; }
    
    

  • 답변 # 2

    이것이 가능하다는 의견이 있지만, 나는 그것을 보지 못하므로 대답은 아니요입니다. Book 유형이 이미 main ()에서 사용 되었기 때문에 간단합니다. 어떻게

    strcpy( book.author, "Nuha Ali");
    
    

    도서 구조에 대해 모르는 경우 실제로 컴파일러에 의해 처리됩니까?
    다음과 같이 함수 선언에서 가능합니다 :

    typedef struct Books Book;
    void foo(struct Books *aBookPtr);
    
    

    이것은 컴파일러가 포인터에 대한 지식으로 행복하게 살 수 있기 때문에 구현시 세부 정보 만 필요합니다. 이것이 도움이 되길 바랍니다.

관련 자료

  • 이전 python - __getattr __ ()이 재정의 된 객체가 TypeError를 발생시키는 이유는 무엇입니까?
  • 다음 c# - xmlserializer - 유형을 반영하는 중에 오류가 발생했습니다