如何声明,而不是定义结构,例如多个文件之间共享的数据。我理解定义基元时的想法。所以,例如,我可能有:
extern int myvalue; /* in shared header file */
和
int myvalue = 5; /* in data.c file */
但是,我如何为结构做同样的事情。例如,如果我有以下类型:
typedef struct {
size_t size;
char * strings[];
} STRLIST;
如果我然后使用声明:
STRLIST list;
这既是宣言又是定义。那么,如何应用相同的使用extern的原则?
答案 0 :(得分:3)
声明一个 结构的实例(或指向一个结构的指针):
extern STRLIST* ptrList;
extern STRLIST list;
定义它:
STRLIST* ptrList;
STRLIST list;
声明结构类型:
typedef struct STRLIST;
定义它:
typedef struct {
size_t size;
char * strings[];
} STRLIST;
请注意,您只能使用指向结构的指针,但必须有一个定义才能直接使用该结构。
答案 1 :(得分:2)
必须声明C中的每个名称,在使用之前。声明是(仅)解释名称描述的类型。这是编译器如何处理此名称对象的信息。
另一方面,定义指示编译器为对象保留内存。定义总是一个声明。
在您的情况下,声明:
STRLIST* list;
确实是一个定义,但它是你(先前声明的)struct的指针的定义。它声明了名称' list'它还为地址保留内存,可以在定义之后指向结构的对象。所以不实际上定义了实际的结构。它不会创建您的结构描述的对象 - 它不会为此类对象保留/分配内存。
答案 2 :(得分:0)
只需简单说明一下dbush的答案:
根据最新的C标准(2020年2月):
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2494.pdf
6.7.2.1结构和联合说明符(p1)
语法
1个struct-or-union-specifier:
struct-or-union属性说明符序列identifieropt { 成员声明列表}
最后,该部分:
struct STRLIST{
size_t size;
char * strings[];
};
是您的结构的声明。
添加typedef,定义 type STRLIST:
typedef struct {
size_t size;
char * strings[];
} STRLIST;
这是您的定义:
STRLIST list;
经验法则:定义为实例提供内存。声明没有。