我之前曾问similar question,但我意识到我无法对宏观和模板做出正面或反面。我是C(而不是C ++)程序员。
F()实际上做了什么?什么时候将字符填入pgmem?什么时候从pgmem中拉出角色?它会缓存它们吗?它如何处理低内存情况?
答案 0 :(得分:25)
没有涉及模板,只有函数重载。 F()
宏做了两件事:
使用PSTR
来确保文字字符串存储在闪存中(代码空间而不是数据空间)。但是,无法打印PSTR("some string")
,因为它会收到一个简单的char *
,表示存储在Flash中的字符串的基址。取消引用该指针将访问数据中相同地址的一些随机字符。这也是F()
也......
将PSTR()
的结果转换为__FlashStringHelper*
。 print
和println
等函数会被重载,因此在收到__FlashStringHelper*
参数时,它们会正确取消引用闪存中的字符。
答案 1 :(得分:0)
顺便说一句。对于ESP32库,这两个函数均在以下文件中定义:
# PSTR : ../Arduino/hardware/espressif/esp32/cores/esp32/pgmspace.h
# F : ../Arduino/hardware/espressif/esp32/cores/esp32/WString.h
和F(x):
// an abstract class used as a means to proide a unique pointer type
// but really has no body
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
...
对于ESP32,也不需要PSTR(x)
,它只是 x :#define PSTR(s) (s)
。