哪一个更好-使用extern或在头文件中声明结构数组并在C中的.c中定义它

wi3ka0sx  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(91)

在头文件ex.h中定义数组结构

#include <stdint.h>

typedef struct example_t{
    const char *pStr;
    uint32_t size;
} example_t;

struct example_t array_struct[2];

然后在.c文件ex1.c中初始化数组结构

#include "ex.h"

struct example_t array_struct[2] = {{"hello", 5}, {"world", 5}};

void ex1()
{
   for (int i = 0; i < 2; ++i){
       printf("%s\n", array_struct[i].pStr);
       printf("%u\n", array_struct[i].size);
   } 
}

在另一个.c文件ex2.c中也使用初始化的结构数组

#include "ex.h"

void ex2()
{
   for (int i = 0; i < 2; ++i){
       printf("%s\n", array_struct[i].pStr);
       printf("%u\n", array_struct[i].size);
   } 
}

这是一个好的实践,还是最好在ex2.c中使用extern,并在ex1.c中定义它?

vulvrdjw

vulvrdjw1#

这是:

struct example_t array_struct[2];

没有声明一个数组,而是在定义一个数组。当您将.c文件链接到可执行文件中时,使用此选项将导致多个定义的编译错误。
要声明它,需要添加extern

extern struct example_t array_struct[2];
ltqd579y

ltqd579y2#

头文件应该只包含声明:数组必须用extern关键字声明,如果没有这个关键字,你有一个定义,而不是声明:

ex.h

#include <stdint.h>

typedef struct example_t {
    const char *pStr;
    uint32_t size;
} example_t;

extern struct example_t array_struct[2];

最好在源文件中包含头文件和实际定义对象的声明,这样编译器就可以检查声明和定义是否一致。在你的例子中,你需要结构定义,但在其他没有这样的constaint的情况下,在对象声明中包含头文件仍然更安全。

相关问题