结构声明与定义

时间:2016-07-05 01:39:30

标签: c struct declaration extern

如何声明,而不是定义结构,例如多个文件之间共享的数据。我理解定义基元时的想法。所以,例如,我可能有:

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的原则?

3 个答案:

答案 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;

经验法则:定义为实例提供内存。声明没有。