首页 > 解决方案 > 将 header 中的结构声明为 typedef

问题描述

我正在尝试将结构定义为头文件中的 typedef 并在许多来源中使用它。我在这里找到了类似的答案,但我不确定是否可以将 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' 的多重定义

标签: cstruct

解决方案


像这样的“声明”

struct msg_encoded_s {
   ...
} msg_encoded_default;

实际上是 (1) 一个struct名为 -type的定义msg_encoded_s和 (2)一个名为 `msg_encoded_default 的类型的变量的定义。

因此,如果您将此头文件包含在单独的翻译单元中,那么您将重新定义一个名为 的变量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};

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

#include "myheader.h"
...
int test = msg_encoded_default.length;  // or something like this

推荐阅读