【发布时间】:2019-04-26 07:28:48
【问题描述】:
我正在尝试将结构定义为头文件中的 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'
【问题讨论】:
-
@JohnnyMopp 我应该同时制作
msg_encoded_default和msg_encodedextern 吗? -
如果您将该头文件包含在程序中的多个源模块中,那么每个源模块都定义了
msg_encoded_default。您应该在一个源模块中定义msg_encoded_default,然后在标题中定义extern(extern msg_encoded msg_encoded_default;) -
错误不是由typedef引起的。这是由
msg_encoded_default变量引起的。 -
既然你有 typedef,你可以使用 typedef 声明
msg_encoded_default变量。例如。在“lib.h”中声明extern msg_encoded msg_encoded_default;,在“lib.c”中声明msg_encoded msg_encoded_default = {{0}, 0};。