在Arduino中编程时避免使用指针和#define
Avoid pointers and #defines when programming in an Arduino?
当我注意到在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告诉你不要使用。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 为什么 #define _LARGEFILE_SOURCE 破坏这些函数指针
- 在Arduino中编程时避免使用指针和#define
- 为指针星号创建一个#define