Как предотвратить многократное появление струн в PROGMEM

Я пытаюсь обезопасить пространство программы, пытаясь уменьшить количество строк в программе. Итак, я начал помещать все нужные строки в файл с пространством имен:

#include <avr/pgmspace.h>
#ifndef __PSTRINGS__
#define __PSTRINGS__
namespace p_strings
{
//golbal
const char right_arrow[] PROGMEM = ">";
const char procent[] PROGMEM = "%";
const char start[] PROGMEM = "Start";
const char speed[] PROGMEM = "Speed: ";
//... more here
}
#endif

Я использую строки, включив их в файл, где они мне нужны, и, например, вызов Display::out_p(1, 0) << p_strings::right_arrow;, Который читает байт из программы и помещает их в правильное положение дисплея.
Но если я посмотрю в .Iss я вижу, что они все еще включены несколько раз в ASM.

000000a8 <_ZN9p_stringsL5startE>:
a8:   53 74 61 72 74 00                                   Start.
...
000000de <_ZN9p_stringsL5startE>:
de:   53 74 61 72 74 00                                   Start.

Так что я думаю, что это не правильное решение для безопасного хранения.

Мои вопросы сейчас:

  1. Почему он все еще включен (в asm) несколько раз? (Может быть, какой-то прятый простой провал моего мышления)
  2. Как мне создать «что-то», что предотвращает это? (Нужно ли мне как-то класс, который я передаю в качестве ссылки?)

Если нужно больше информации, дайте мне знать.

1

Решение

В C ++ const переменная по умолчанию имеет внутреннюю связь (как если бы она была static) — что обычно означает, что каждая единица перевода (каждая .cpp файл) получает свою собственную копию. Это может быть очень хорошо, почему вы видите их несколько раз.

Что вы хотели бы сделать, это объявить переменные как extern, а затем определить их в одном исходном файле.

1

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


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