gpt4 book ai didi

c++ - __FUNCTION__ 上的 PSTR()

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:34 30 4
gpt4 key购买 nike

使用 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'

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

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

这不是宏通用的东西,因为 __FILE__ 可以编译并正常工作:

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

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

最佳答案

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

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

The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";
appeared, where function-name is the name of the lexically-enclosing function.

According to the GCC manual__FUNCTION____PRETTY_FUNCTION__ 只是 C 语言中 __func__ 的同义词(__PRETTY_FUNCTION__ 对于 C++ 来说更冗长)。

关于c++ - __FUNCTION__ 上的 PSTR(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976388/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com