Макрос F() — это аналог PSTR.
Весь смысл в том, что эти макросы не работают вне функций. А нам нужно было инициализировать глобальные переменные в кодовой памяти указателями на строку.
static const char *pStr = PSTR("Hello");
// error: statement-expressions are not allowed outside functions nor in template-argument lists
Естественно, мы делали так же, как указал LampTester, но нам было лень постоянно так делать и мы нашли такой способ.
Согласен, этот способ работает, но требуется написать две строки вместо одной.
strcpy_P(dest,SPS("Hello world!"));
Плюс сама строка располагается непосредственно в месте ее использования. Ваш пример сложно будет читать, если эти две строки не будут помещаться в экран.
Плюс не требуется придумывать имена для переменных, хранящих строку, что является лишним трудом.
Короче, лень — двигатель прогресса.
Кстати, рекомендуемый в документации способ, не работал одно время. Компилятор ругался, что __attribute__((__progmem__)) не может быть использован при создании переменной, а только в объявлении. Это было давно, но именно оттуда у меня привычка писать отдельно объявление, а потом инициализацию.
С этим способом создания пользовательских литералов я не был знаком. Почитал вашу статью. Спасибо огромное.
Это, действительно, должно упростить раскрытие символов в макросе SPLIT_TO_CHAR.
Сейчас будем пробовать. Только компилятор обновим, а то наш еще не хочет такую строку кушать.
Весь смысл в том, что эти макросы не работают вне функций. А нам нужно было инициализировать глобальные переменные в кодовой памяти указателями на строку.
Естественно, мы делали так же, как указал LampTester, но нам было лень постоянно так делать и мы нашли такой способ.
Плюс сама строка располагается непосредственно в месте ее использования. Ваш пример сложно будет читать, если эти две строки не будут помещаться в экран.
Плюс не требуется придумывать имена для переменных, хранящих строку, что является лишним трудом.
Короче, лень — двигатель прогресса.
Кстати, рекомендуемый в документации способ, не работал одно время. Компилятор ругался, что __attribute__((__progmem__)) не может быть использован при создании переменной, а только в объявлении. Это было давно, но именно оттуда у меня привычка писать отдельно объявление, а потом инициализацию.
Это, действительно, должно упростить раскрытие символов в макросе SPLIT_TO_CHAR.
Сейчас будем пробовать. Только компилятор обновим, а то наш еще не хочет такую строку кушать.