С помощью avr-gcc
возможно сохранение данных в памяти программ для экономии оперативной памяти. Это достигается с помощью Атрибут PROGMEM. AVR-libc также предоставляет макрос, PSTR (), который может быть использован с литеральными строками.
Сейчас я пытаюсь использовать PSTR()
с __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 () для вставки имени функции в памяти программы?
__func__
, __FUNCTION__
а также __PRETTY_FUNCTION__
не строковые литералы, как __FILE__
, но создаются как статические переменные локального массива char для функции, из которой вы их используете. Итак PSTR()
макрос потерпит неудачу, так как вы не можете использовать переменную массива для инициализации другой переменной массива, подобной этой.
__func__
описано в C11, §6.4.2.2 ¶1:
Идентификатор
__func__
должен быть неявно объявлен переводчиком, как если бы,
сразу после открывающей скобки каждого определения функции, объявлениестатический константный символ__func__
знак равноимя-функции«;появился, где
function-name
это имя лексически заключающей в себя функции.
Согласно руководству GCC, __FUNCTION__
а также __PRETTY_FUNCTION__
просто синонимы для __func__
в С (__PRETTY_FUNCTION__
более многословен для C ++).
Других решений пока нет …