Дублирующие символы с var, определенные в защите заголовка и множественного включения

У меня есть этот файл заголовка (называемый ft_opp.h), который я пытаюсь # включить в два разных файла .c:

#ifndef __FT_OPP_H__ # define __FT_OPP_H__ t_opp gl_opptab[] = {{"-", &ft_sub}, \ {"+", &ft_add}, \ {"*", &ft_mul}, \ {"/", &ft_div}, \ {"%", &ft_mod}, \ {"", &ft_usage}}; #endif /* __FT_OPP_H__ */ 

У меня нет выбора, кроме как использовать этот файл без изменений для определения массива gl_opptab (это часть упражнения в школе, и я должен использовать этот файл как есть).

Однако после компиляции я получаю следующее сообщение от GCC:

дублировать символ _gl_opptab в: /var/folders/zz/zyxvpxvq6csfxvn_n0000hvc00046v/T//ccrPWPyP.o /var/folders/zz/zyxvpxvq6csfxvn_n0000hvc00046v/T//cc2JUzLs.o ld: 1 дубликат символа для архитектуры x86_64 collect2: ld возвращен 1 статус выхода make: * [ft_advanced_do-op] Ошибка 1

Я попытался включить его только в один файл и использовать extern t_opp* gl_opptab в другом .c файле. Но, похоже, это не работает.

Как я мог это сделать?

extern t_opp* gl_opptab – это не то же самое, что массив структур, определенных в заголовке. Попробуйте extern t_opp gl_opptab[]; в другом .c файле. Конечно, другой .c-файл должен знать, что такое t_opp , поэтому есть еще один заголовок, который должен быть включен в другой .c файл.