在这个例子中,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;
}
您可以在手前转发声明它和typedef:
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; }
虽然有人评论说这是可能的,但我没有这么认为,所以我的答案是否定的。仅仅因为类型Book已经在main()中使用,例如怎么可能
strcpy( book.author, "Nuha Ali");
如果它不知道Books结构,实际上会被编译器处理? 它可以在函数声明中,如下所示:
typedef struct Books Book;
void foo(struct Books *aBookPtr);
这是因为编译器可以愉快地将知识与指针一起使用,并且只需要实现中的细节。希望这可以帮助。