ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
28 ноября
1556598 Топик полностью
Nikolaj (Сегодня, 06:50 - 07:13, просмотров: 108) ответил mse homjak на Наскока я понял, мне придётся писать
Возможные варианты решения " 

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е чем один *.с файл в процессе модификации.