ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
28 ноября
1556578 Топик полностью
Nikolay_Po (Вчера, 23:19, просмотров: 66) ответил mse homjak на Ну, надо попробовать, пасибо.
Да что пробовать, так надо делать. 

Это плюсовики меня мордой тычут - делают всю библиотеку в одном файле *.hpp. А в "тёплом ламповом Си" было задумано так. Объявления - в заголовках, реализация - в коде. Это единственный вариант, который работает я когда нужно одну и ту же переменную (или константу) сделать доступной в разных файлах *.c.

Поэтому объявляем тип, объявляем переменную как extern. А определение (то, что действительно выделяет память), делаем только одно, не в заголовке.

Есть ещё такой прикол: если переменная - не переменная, а константа, то при оптимизации, компилятор может построить исполнение кода исходя из значения, определённого на этапе компиляции. Грубо говоря, жёстко закодировать значение в поток действий. И если вдруг эту константу хочется централизованно менять, как ячейку во флеш, например, то придётся объявлять её как volatile const. Это будет указанием принудительно выполнять обращение к ячейке памяти при доступе к этой константе, даже если эта ячейка - в ПЗУ. Так можно избежать глубокого вплетения значения константы в код. Столкнулся с таким, когда хотел сделать серийный номер устройства в прошивке. Компилятор просто фиксировал номер в коде, в инструкциях загрузки литералов в регистры ЦП при чтении. Поменять номер как цельное значение возможности не было. А вто как добавил квалификатор volatile к квалификатору const, так сразу серийный номер объявился в секции констант во флеш и стал доступен к изменению.