«Декларация», подобная
struct msg_encoded_s {
...
} msg_encoded_default;
, фактически является одновременно (1) определением struct
-типа с именем 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