Невозможно объявить переменную в библиотеке, в которой нет класса: множественное определение переменной

Я создал библиотеку Lib, в которой нет класса. Я хочу, чтобы в этой библиотеке была переменная, к которой можно было бы получить доступ извне. Я бы сделал это просто объявив их в заголовочном файле.

Однако, если я сделаю это следующим образом:

int myVariable = 1;

с файлом .cpp, содержащим только

#include "Lib.h"

Я получаю это сообщение об ошибке при компиляции пустого скетча, включающего эту библиотеку:

множественное определение `myVariable'

и по какой-то странной причине

Для "Lib.h" найдено несколько библиотек

вдобавок ко всему (хотя я сталкивался с этим раньше - когда во время компиляции возникает какая-то ошибка, эта ошибка может появиться вместе с ней, даже если нет нескольких библиотек; она исчезает, когда другие ошибки компиляции также разрешены).

Что вызывает эту ошибку и как ее устранить?

, 👍0

Обсуждение

Есть ли у вас защита включения вокруг кода вашей библиотеки, чтобы ее нельзя было включить несколько раз?, @chrisl

Нет, не знаю. Будет ли это иметь значение, если библиотека будет включена только один раз в пустой скетч?, @LukasFun

Не знаю, это было просто дикое предположение. Вы можете попробовать это с включенными охранниками. Если вы определили переменную только в заголовочном файле, то я думаю, что единственный способ, которым ее можно определить несколько раз, - это многократное включение заголовочного файла. Может быть, потому что вы включили его в свой файл cpp и в свой основной скетч., @chrisl

const int myVariable = 1; если это константа, @Juraj


2 ответа


Лучший ответ:

3

В Lib.h вы должны объявить

extern int myVariable;

В Lib.cpp вы можете определить его один раз

#include "Lib.h"
int myVariable=123;
...
,

В чем проблема назначить его в файле C вместо файла заголовка (поскольку файл C включает файл заголовка, все доступно во время компиляции)?, @Michel Keijzers

«Я не могу использовать его для целей, которые требуют, чтобы значение переменных было известно во время компиляции». -- Тогда вам не следует использовать переменную. Если это требуется во время компиляции, вам нужна константа, а не переменная. Переменные меняются. Если это требуется во время компиляции, вы действительно не хотите, чтобы это менялось. Это должна быть константа или #define., @Majenko


1

Если вам нужна "переменная", которая используется во время компиляции, например, для установки размера массива, тогда переменная не вам нужна.

Переменные меняются. Вот что значит "переменная". Если вы используете его для чего-то во время компиляции, он не может быть переменным, так как он никогда не должен меняться.

Следовательно, вам нужен либо константа, либо макрос #define, который заменяется литералом. И то, и другое можно сделать в заголовке, так как они оба по умолчанию имеют локальную область действия TU:

const int myVariable = 123;

Или использовать макрос:

#define SAMPLE_ARRAY_SIZE 123
,