使用avr-gcc
可以将数据存储在程序存储器中以节省RAM。这是使用PROGMEM attribute完成的。 AVR-libc还提供了一个宏PSTR(),可以用于文字字符串。
现在我正在尝试将PSTR()
与__func__
, __FUNCTION__
or __PRETTY_FUNCTION__
.
以下代码按预期工作,
display.message(__func__, 2);
display.message(__FUNCTION__, 2);
display.message(__PRETTY_FUNCTION__, 2);
,虽然任何这些行的编译都失败了,
display.messageP(PSTR(__func__), 2);
display.messageP(PSTR(__FUNCTION__), 2);
display.messageP(PSTR(__PRETTY_FUNCTION__), 2);
,出现以下错误:
initializer fails to determine size of '__c'
来自WinAVR / avr / include / avr的PSTR定义解释了错误消息中引用的变量:
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
这不是宏的一般性,因为__FILE__
编译并正常工作:
display.messageP(PSTR(__FILE__), 2);
有关导致此错误的原因的任何想法,以及是否可以使用PSTR()在程序存储器中插入函数名称?
答案 0 :(得分:8)
__func__
,__FUNCTION__
和__PRETTY_FUNCTION__
不是字符串文字,例如__FILE__
,但是就像您使用它们的函数一样创建静态本地字符数组变量。因此,PSTR()
宏将失败,因为您无法使用数组变量来初始化另一个数组变量。
__func__
在C11,§6.4.2.2¶1中描述:
识别者
__func__
应由译者隐含地宣布,好像, 紧接着每个功能定义的开头括号,声明
static const char出现了,其中__func__
[] = "function-name";function-name
是词汇封闭函数的名称。
According to the GCC manual,__FUNCTION__
和__PRETTY_FUNCTION__
只是C中__func__
的同义词(__PRETTY_FUNCTION__
对于C ++来说更加冗长。)