在Arduino中编程时避免使用指针和#define

Avoid pointers and #defines when programming in an Arduino?

本文关键字:指针 #define Arduino 编程      更新时间:2023-10-16

当我注意到在Commenting your Code部分,它建议避免使用指针和#定义时,我正在查看Arduino的StyleGuide。

作者这么说有什么原因吗?至于他/她为什么这么说,没有任何解释。这对我来说没有意义。这是嵌入式系统特有的吗?

我不知道作者写它的具体原因,我也不熟悉库的编写风格-所以我将以c++程序的一般术语来回答。

我认为给出这个首选项是因为现代c++通常倾向于其他习惯用法,其中许多习惯用法的设计是为了避免或最小化预处理器和原始指针经常引入的问题。

<<p> 避免指针/strong>

在c++中,通常使用引用来指代对象或容器,如vector来指代对象集合,而不是指针。

//////// For an object
//// Using a pointer
bool getURL(t_url* const outUrl);
// In use:
bool result(obj.getURL(&outUrl));
//// versus using a reference
bool getURL(t_url& outUrl);
// In use:
bool result(obj.getURL(outUrl));
//////// For a collection
//// Using a pointer
bool apply(const double* const values, const size_t& count);
// In use:
bool result(obj.apply(array, count));
//// versus using a container
bool apply(const std::vector<double>& values);
// In use:
bool result(obj.apply(values));

甚至指针也可以被赋予对象容器(自动指针,智能指针,共享指针,弱指针),因为在处理原始指针时可能会有很多复杂性或模糊性,特别是在客户端代码中。我很少编写接受或返回原始指针的c++程序。

避免定义

预处理器/定义通常也不是c++中首选的方法——你有内联函数、匿名命名空间、模板和枚举。

一个普遍存在的宏的问题的例子是#define max(a,b) ((a > b) ? a : b),而不是std::max

结论

如果我看到一个c++程序大量使用了这两种语言中的一种,我就会怀疑它是在哪个年代写的,或者作者是不是用"带有更多特性的C"方言写的。

另一个回答说"建议是垃圾"。我不同意。Arduino中的建议简单地说"避免指针"answers"避免#定义"。当然,有时您需要使用这些工具,但是当您使用旨在取代它们的语言和库工具(通常它们被误用或有问题)时,您可以编写更清晰的程序。避免使用它们意味着只在必要的时候使用它们,更倾向于使用更现代和更习惯的替代方法。

这个建议是垃圾——指针是一个非常有用和强大的工具,而且为了有效地完成某些事情,经常需要它们。

另一方面,出于多种原因(一二三四)应该避免使用

#define s,而应该使用内联函数,但是在许多情况下应该使用宏,并且宏是最佳解决方案。这取决于你的问题——聪明点,知道什么时候该用,什么时候不该用。不要盲目地避免使用它们,因为一些FAQ告诉你不要使用。