6

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

现在我正在尝试使用PSTR()with__func__或.__FUNCTION____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'

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

# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))

这对宏来说不是通用的,因为__FILE__编译和工作正常:

display.messageP(PSTR(__FILE__), 2);

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

4

1 回答 1

8

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

__func__在 C11, §6.4.2.2 ¶1 中有描述:

标识符__func__应由翻译器隐式声明,就好像紧跟在每个函数定义的左大括号之后,声明

静态 const char __func__[] = "函数名";
出现,其中function-name是词法封闭函数的名称。

根据 GCC 手册__FUNCTION__并且__PRETTY_FUNCTION__只是 C 中的同义词__func____PRETTY_FUNCTION__对于 C++ 更冗长)。

于 2013-07-31T17:02:51.800 回答