Множественное определение объектного файла - PullRequest
2 голосов
/ 11 июля 2019

У меня есть два *.c файла. fileA.c и fileB.c Я определяю структуру с одинаковым именем в обоих файлах, но оба они локально присутствуют в каждом файле как глобальные переменные.

Например:

fileA.c

typedef struct
{
int a;
}MyHandler_t;

MyHandler_t myHandler =
{
.a = 0, 
};

fileB.c

typedef struct
{
int a;
}MyHandler_t;

MyHandler_t myHandler;

Проблема в том, что если я попытаюсь инициализировать переменную a в структуре в файле B, я получу multiple definition of "myHandler". Даже если я пытаюсь оставить это в пустых скобках, я получаю ту же ошибку. Почему это происходит?

Оба файла содержат функции, которые используются в main.c в основной функции, но эти структуры выше являются локальными глобальными переменными, которые используются для управления конечным автоматом.

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

В C. не существует такой вещи, как "локальная глобальная переменная". myHandler - это глобальная переменная, определенная в обоих исходных файлах.Это недопустимо, поскольку каждая глобальная переменная может иметь только одно определение.

Если вы хотите, чтобы каждый исходный файл имел свою собственную локальную переменную file myHandler, вы должны объявить ее static:

static MyHandler_t myHandler =
{
.a = 0, 
};

Обратите внимание, что таким образом код в других исходных файлах не может получить доступ к этой переменной по имени.

0 голосов
/ 11 июля 2019

Переместить typedef в заголовочный файл .h.В оба .C Giles включен заголовочный файл.В одном из файлов C сделайте переменную extern и удалите инициализацию.Вы можете добавить только одну инициализацию одной и той же переменной во всем проекте

Yuo также может использовать как статические, так и они будут глобальными в области действия модуля компиляции (то есть файла)

...