Объявление глобальных переменных в файле заголовка или исходном файле C

Я немного запутался в целом, включая заголовочные файлы и объявление переменных.

Используемые мной файлы: main.c, lib.h и lib.c.

main.c

#include "lib.h"

void main(void)
{
    // Code here
    var++;
}

lib.c

#include <avr/io.h>
#include "lib.h"

void light_led(void)
{
    // Code here
}

lib.h

volatile int var;

void light_led(void);

Является ли это правильным способом создания и включения собственных пользовательских библиотек?

Ответ 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 указывает, что переменная или функция имеет внутреннюю привязку (ее имя не видно извне файла, в котором она объявлена).

Подробнее см. ниже: