他们是邪恶的吗?也许。全局变量的问题在于,它们可以在任何时间不受执行的任何功能或代码段的访问和修改。假设这可能导致难以追溯和解释的情况。因此,希望使全局变量的数量最小化,如果可能的话,使数量回到零。
可以避免吗?几乎总是可以。Arduino的问题在于,他们迫使您采用两种功能方法,即假设您setup()
和您loop()
。在这种特殊情况下,您将无法访问这两个函数的调用方函数的范围(可能是main()
)。如果有的话,您将可以摆脱所有全局变量,而使用本地变量。
图片如下:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
这大概或多或少是Arduino程序主要功能的样子。然后,您最好在setup()
和loop()
函数中都需要变量,然后在main()
而不是全局范围内声明。然后,可以通过将它们作为参数传递(如果需要,可以使用指针)来使它们可用于其他两个函数。
例如:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
请注意,在这种情况下,您还需要更改两个功能的签名。
因为这可能不可行也不合乎需要,所以我实际上只看到了一种无需修改强制程序结构即可从Arduino程序中删除大多数全局变量的方法。
如果我没记错的话,那么您在为Arduino编程时完全可以使用C ++,而不是C。如果您还不熟悉OOP(面向对象编程),或C ++,它可能需要一些时间来适应和一些阅读。
我的建议是创建一个Program类,并创建该类的单个全局实例。类应被视为对象的蓝图。
考虑以下示例程序:
class Program {
public:
Program();
void setup();
void loop();
private:
int myFirstSampleVariable;
int mySecondSampleVariable;
};
Program::Program() :
myFirstSampleVariable(0),
mySecondSampleVariable(0)
{
}
void Program::setup() {
// your setup code goes here
}
void Program::loop() {
// your loop code goes here
}
Program program; // your single global
void setup() {
program.setup();
}
void loop() {
program.loop();
}
Voilà,我们摆脱了几乎所有的全球客户。开始添加应用程序逻辑的功能将是Program::setup()
和Program::loop()
功能。这些函数有权访问实例特定的成员变量myFirstSampleVariable
,mySecondSampleVariable
而传统函数setup()
和loop()
函数无权访问,因为这些变量已被标记为私有类。这个概念称为数据封装或数据隐藏。
教你OOP和/或C ++有点超出了此问题的答案范围,所以我在这里停止。
总结:应该避免使用全局变量,并且几乎总是可以大幅度减少全局变量的数量。同样在为Arduino编程时。
最重要的是,我希望我的回答对您有所帮助:)