PSTR()on __FUNCTION__

时间:2013-07-31 16:55:36

标签: c++ c embedded avr-gcc

使用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()在程序存储器中插入函数名称?

1 个答案:

答案 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 ++来说更加冗长。)