PSTR()on __FUNCTION__

mMo*_*ntu 5 c c++ embedded avr-gcc

使用avr-gcc它可以将数据存储在程序存储器中以节省RAM.这是使用PROGMEM属性完成的.AVR-libc还提供了一个宏PSTR(),它可以用于文字字符串.

现在,我尝试使用PSTR()__func__,__FUNCTION____PRETTY_FUNCTION__.

以下代码按预期工作,

display.message(__func__, 2);
display.message(__FUNCTION__, 2);
display.message(__PRETTY_FUNCTION__, 2);
Run Code Online (Sandbox Code Playgroud)

,虽然任何这些行的编译失败,

display.messageP(PSTR(__func__), 2);
display.messageP(PSTR(__FUNCTION__), 2);
display.messageP(PSTR(__PRETTY_FUNCTION__), 2);
Run Code Online (Sandbox Code Playgroud)

,出现以下错误:

initializer fails to determine size of '__c'
Run Code Online (Sandbox Code Playgroud)

来自WinAVR/avr/include/avr的PSTR定义解释了错误消息中引用的变量:

# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
Run Code Online (Sandbox Code Playgroud)

这不是宏的一般性,因为__FILE__编译和工作正常:

display.messageP(PSTR(__FILE__), 2);
Run Code Online (Sandbox Code Playgroud)

有关导致此错误的原因的任何想法,以及是否可以使用PSTR()在程序存储器中插入函数名称?

jxh*_*jxh 8

__func__,__FUNCTION__并且__PRETTY_FUNCTION__不是字符串文字,__FILE__但是,它们像静态本地字符数组变量一样创建到您正在使用它们的函数中.因此,PSTR()宏将失败,因为您不能使用数组变量来初始化另一个数组变量.

__func__ 在C11,§6.4.2.21中描述:

__func__译者应隐含地声明标识符,就好像紧接每个功能定义的开头一样,声明

static const char __func__[] = "function-name";
出现了,function-name词法封闭函数的名称在哪里.

根据GCC手册,__FUNCTION__并且__PRETTY_FUNCTION__只是用于同义词__func__在C(__PRETTY_FUNCTION__为C++更详细).