定义I / O引脚的最佳方法是什么?


9

我读过这样的定义

const int ledPin = 9;

并且

#define ledPin 9

我知道像这样的定义

int ledPin = 9;

如果您不打算更改它(通常不会),这是一个坏习惯,尽管我在Arduino程序中已经多次看到了。其他两个中的哪一个是首选?

Answers:


6

#define ledPin 9是首选。这样,int ledPin = 9;您将分配一个int每次使用都会使用其值的内存ledPin#define在不分配内存的意义上有所不同。没有所谓的记忆ledPin。在编译之前,代码中的所有“ ledPin”(字符串除外)都被替换9。所以基本上

digitalWrite(ledPin);

变成

digitalWrite(9);

优点#define:节省内存,并且在执行前全部ledPin替换为,因此节省了处理器时间。9

小代码并不重要...


嵌入式编译器真的很糟糕,使用时不进行连续折叠const int吗?
Chuu 2015年

1
据我所知,@ chuu Arduino使用gcc进行avr。因此,几乎绝对应该对其进行优化。这里的答案并没有显示出对C ++良好实践的太多理解
chbaker0

3
在C ++中,const int ledPin = 9;优先于其他2个选项。int除非您在某个地方定义了指向它的指针,否则不会为任何对象分配内存。
jfpoilpret 2015年

const int确实分配了内存@jfpoilpret。#define不会占用任何内存,因为它只是一个表达式的符号名称,而不是内存的名称...

检查此链接cplusplus.com/forum/beginner/28089并亲自看看。否则,只需使用Arduino IDE执行检查:使用const和#define检查数据大小。
jfpoilpret 2015年

4

严格来说,该#define方法将使用较少的内存。差异通常很小。如果您需要减少内存使用量,那么其他优化可能会更加有效。

支持使用的论点const int类型安全。无论在何处通过变量引用该引脚号,您都确切知道要获取的数据类型。使用它的代码可能会隐式或显式地对其进行升级/转换,但是其行为应非常明确。

相反,a中的值#define易于解释。在绝大多数情况下,它可能根本不会给您带来任何问题。如果您有对值的类型或大小进行假设的代码,则只需小心一点。

就个人而言,除非我非常需要节省内存,否则我几乎总是喜欢类型安全。


在读完彼得的答案之前,我一直在#define营地。猜猜我知道谁将在本周末重构代码。;)
linhartr22'5

2

最好的方法可能是
const uint8_t LED_PIN = 9; // may require to #include <stdint.h>

const byte LED_PIN = 9; // with no include necessary
const unsigned char LED_PIN = 9; // similarly
。按照C ++(和其他方法)的常规惯例,以大写形式命名常量。这本身不应使用任何RAM,并且每次使用大约1个字节的程序存储器。
但是,当数字大于127并被提升为更大的带符号整数时,符号扩展时可能会出现问题(对此尚不完全确定),尽管引脚号不太可能发生这种情况。


-1

不仅会

const int ledPin = 9;

占用RAM,但是在这种情况下,由于digitalWrite(uint8_t, uint8_t)只需要一个字节的参数,将使用比必要的更多的RAM ,并且int通常为两个字节(与编译器相关,但很典型)。请注意,您可以在#define中为文字提供显式类型:

#define ledPin ((int)9) 

尽管在诸如函数参数这样的上下文中需要特定类型(因为该函数已正确原型化!),但是如果类型不匹配,则将隐式转换或获取错误消息。


@DrivebyDownvoter,您能否评论您的原因?
JRobert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.