Я нахожусь в процессе переноса кода, написанного для компиляции для одного чипа, на другой чип.
Одна из возникших проблем — это множество множественных ошибок определения. Некоторые из них, по-видимому, связаны с тем, что компоновщик для первого чипа позволяет мне лениться с объявлением переменных extern, когда они должны использоваться в нескольких исходных файлах. Раньше я вообще не использовал extern (объявлял и определял переменную в something.h, использовал ее в something.cpp и других исходных файлах, которые включали something.h), и он отлично скомпилировался и линковался.
Думаю, я исправил эти проблемы достаточно хорошо: теперь мои переменные, которые являются общими, имеют этот шаблон:
Что-то.ч
extern int foo;
Что-то.cpp
int foo = 0;
//using foo to do stuff
Main.cpp
#include "Something.h"
//using foo to do stuff
Все хорошо.
Вот немного, что я не понимаю, и не могу найти ответы ни здесь, ни в Google. Я заметил одни и те же множественные ошибки определения, вызванные переменными, объявленными и определенными в Something.h и используемыми только в Something.cpp.
У Something.h есть защита включения, поэтому я не думаю, что это связано с тем, что Something.h несколько раз включался где-то в моей программе.
Ошибка исчезнет, если я объявлю ее как extern и определю в файле cpp, но мне это кажется неправильным. Я считаю, что extern не нужен для связи переменной между Something.h и Something.cpp.
Буду очень признателен за любые советы, мне бы очень хотелось понять, чего мне здесь не хватает.
(Кстати, я компилирую для ESP32 с помощью Arduino IDE.)
Something.h
только вSomething.cpp
или, возможно, также и вSomeOtherThing.cpp
? (Подумайте о том, что происходит, когда вы компилируете разные единицы перевода, использующие один и тот же заголовок.) - person Mat   schedule 19.03.2019#include "Something.h"
внутри. Guard будет эффективен только в том случае, если у вас есть несколько (вероятно, косвенных)#include "Something.h"
в одном файле. Каждый источник создает экземпляр одной и той же переменной. - person harper   schedule 19.03.2019