我正在将原本编译到一种芯片的代码移植到另一种芯片上。
出现的一个问题是多个定义错误。其中有些似乎是由于第一种芯片的链接器让我在跨多个源文件使用变量时可以懒惰地声明为extern。先前我根本没有使用extern(在something.h中声明和定义变量,然后在包括something.h的something.cpp和其他源文件中使用它),但它可以完美地编译和链接。
我认为我已经很好地解决了这些问题:现在我的共享变量具有以下模式:
Something.h
extern int foo;
Something.cpp
int foo = 0;
//using foo to do stuff
Main.cpp
#include "Something.h"
//using foo to do stuff
一切正常。
这里有一部分我不理解,也找不到任何答案,无论是在这里还是在谷歌上。我注意到同样的多重定义错误是由于在Something.h中声明和定义并且仅在Something.cpp中使用的变量所引起的。
Something.h有一个包含保护,因此我不认为这是由于Something.h在程序中的某个地方被多次包含造成的。
如果我将其声明为extern并在cpp文件中定义,错误就会消失,但我觉得这样做不对。我相信extern不需要用于连接Something.h和Something.cpp之间的变量。
非常感谢任何建议,我真的很想了解我在这里错过了什么。
(顺便说一句,我正在使用Arduino IDE为ESP32编译。)
Something.h
只包含在Something.cpp
中还是可能也包含在SomeOtherThing.cpp
中?(考虑编译使用同一头文件的不同翻译单元时会发生什么。) - Mat#include "Something.h"
时会针对每个源文件发挥作用。只有在一个文件中有多个(可能是间接的)#include "Something.h"
时,该 guard 才会生效。每个源文件都会创建相同变量的实例。 - harper