объявить структуру в заголовке как typedef - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь определить структуру как 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 '

1 Ответ

0 голосов
/ 23 ноября 2018

«Декларация», подобная

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...