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

Jer*_*ter 2 c++ pointers arduino

当我注意到在该部分中,它建议避免使用指针和#defines 时,我正在查看Arduino 的StyleGuideCommenting your Code.

这位作家是否有理由说明这一点?没有解释为什么他/她说这个.这对我来说没有意义.这是嵌入式系统特有的吗?

jus*_*tin 7

我不知道作者写这篇文章的具体原因,我不熟悉图书馆的书面风格 - 所以我将回答一般的C++程序.

我假设给出了偏好,因为现代C++通常支持其他习语,其中许多习惯用于避免或最小化预处理器和原始指针经常引入的问题.

避免使用指针

在C++中,通常使用对象的引用或对象的集合(例如向量)来代替指针.

//////// 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));
Run Code Online (Sandbox Code Playgroud)

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

避免定义

预处理器/定义通常也不是C++中的首选方法 - 您具有内联函数,匿名名称空间,模板和枚举.

宏的无处不在的例子是有问题的原因是多方面的#define max(a,b) ((a > b) ? a : b),对std::max.

结论

如果我看到一个使用相当数量的C++程序,我发现自己想知道它写的是什么十年,或者作者是在写"C with some more features"方言.

另一位回答者说"建议是垃圾".我不同意.Arduino中的建议只是说"避免指针"和"避免#define`".当然,有时您需要使用这些设施,但是当您使用旨在替换它们的语言和库设施时(您可能会误用它们或出现问题),您可以编写更清晰的程序.为了避免使用这些手段,谨慎,只有必要时才使用它们,有利于更现代和地道的替代品.