PSTR () на __FUNCTION__

С помощью 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 () для вставки имени функции в памяти программы?

5

Решение

__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 ++).

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]