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()在程序存储器中插入函数名称?
__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++更详细).
| 归档时间: |
|
| 查看次数: |
8378 次 |
| 最近记录: |