https://onlinegdb.com/FaQEaKGmG
"[1] В Си переменная объявленная в *.с вне функции - глобальная. С некоторыми условностями (см. примеры 5 и 6 по ссылке) к ней можно обратится из функции другого *.с. Для того что бы иметь возможность использовать одно и то же определение для переменной в разных *.с файлах используется "static" в их определении - тогда переменная "видна" только в том *.с файле где она определена и только от того места в файле где определена и ниже. Но по своей сути определённые таким образом переменные - суть разные переменные и ведут себя независимо друг от друга!
Примеры 1 и 2 - эквивалентны между собой, это вариант объявления ТС.
Примеры 3 и 4 - эквивалентны между собой, вариант решения проблемы ТС с учётом [1].
Пример 5 - попытка обращения объявленной переменной в одном файле (f1.c) из другого (main.c) - ошибка, переменная во втором файле (main.c) "не видна".
Пример 6 - попытка обращения объявленной переменной в одном файле (f1.c) из другого (main.c) с учётом [1] - всё корректно. "Видимость" переменной "iVar" из f1.c в main.c определена посредством "extern const int iVar;" (компилятору сказано что переменная такого типа где-то определена, потом линкер подставить её адрес).
Пример 7 - то же что и в Пример 5, но для функции. Здесь возможны варианты от ошибки до предупреждения в зависимости от настроек. В частности тот же ЙАР в Debug-конфиге выдаёт предупреждение "Warning[Pe223]: function "ptTelemetry_init" declared implicitly", за ошибку не считает и если в проекте (в объектниках после компиляции) вызываемая ф-ия есть - линкует её и проект норм работает.
З.Ы. предполагаю что проблема возникла после того как *.h с объявлением структуры был подключен в боле5е чем один *.с файл в процессе модификации.
-
- Самый правильный вариант Nikolaj(30 знак., Сегодня, 07:07, ссылка, ссылка)