将标头中的结构声明为typedef

时间:2018-11-23 17:29:07

标签: c struct

我正在尝试将结构定义为头文件中的typedef并在许多源中使用它。我在here中找到了类似的答案,但是我不确定typedef是否可以定义为extern。另外,msg_encoded应该具有默认值。

// lib.h

#ifndef lib_h
#define lib_h

struct msg_encoded_s
{
    uint8_t msg[10];
    int length;
} msg_encoded_default = {{0}, 0};

typedef struct msg_encoded_s msg_encoded;

#endif

// lib.c

#include "lib.h"

msg_encoded some_var;

// main.c

# include "lib.h"
int main(){
    msg_encoded some_other_var;
}
  

main.o :(。bss.msg_encoded_default + 0x0):的多个定义   `msg_encoded_default'

1 个答案:

答案 0 :(得分:2)

“声明”之类的

struct msg_encoded_s {
   ...
} msg_encoded_default;

实际上是(1)名为struct的{​​{1}}类型的定义和(2)名为`msg_encoded_default的这种类型的变量的定义。 / p>

因此,如果将此头文件包含在单独的翻译单元中,则将重新定义名为msg_encoded_s的变量。

要解决此问题,请写一个标题,如...

msg_encoded_default

在一个翻译单元中准确地写道:

typedef struct msg_encoded_s
{
    uint8_t msg[10];
    int length;
} msg_encoded;

extern msg_encoded msg_encoded_default;

在所有其他翻译单元中只需写...

#include "myheader.h"
msg_encoded msg_encoded_default = {{0}, 0};