Ответ 1
Вы должны использовать ключевое слово extern
для таких случаев и не определять глобальные переменные в заголовках. В противном случае компоновщик будет вызывать ошибки при работе с вашими файлами заголовков.
lib.c
#include <avr/io.h>
#include "lib.h"
volatile int var;
void light_led(void)
{
//code here
}
lib.h
extern volatile int var;
void light_led(void);
Таким образом вы будете объявлять глобальную переменную в заголовках и фактически определять ее в соответствующем исходном файле lib.c
.
Примечание: Обратите внимание на разницу между объявлением и определением переменной. Ключевое слово extern
позволяет объявлять переменную заранее, не определяя ее. Если бы вы не определили переменную в lib.c
, была бы ошибка при попытке использовать эту переменную. Поскольку это только объявлено, но не на самом деле определено.
Изменить: Цель static
состоит в том, чтобы объявить, что переменная является частной для исходного файла, который был объявлен. Так как extern
делает обратное, связывая переменную, определенную в другой исходный файл, он побеждает цель static
. extern
говорит, что переменная имеет внешнюю связь static
говорит, что переменная имеет внутреннюю привязку. Идентификатор не может иметь как внутреннюю, так и внешнюю связь.
Согласно MSND:
При изменении переменной ключевое слово static указывает, что переменная имеет статическую продолжительность (она выделяется при запуске программы и освобождается при завершении программы) и инициализирует ее до 0, если не указано другое значение. При изменении переменной или функции в области файла ключевое слово static указывает, что переменная или функция имеет внутреннюю привязку (ее имя не видно извне файла, в котором она объявлена).
Подробнее см. ниже: