Макрос преобразования строк - PullRequest
0 голосов
/ 25 декабря 2018

Я должен хранить некоторые строки с пользовательской кодировкой (скажем, A-> 0, B-> 1 и т. Д.).

Я хотел бы иметь возможность объявить их как:

u8 string1[] = ENCODE("ABC");

, а не:

u8 string1[] = {0, 1, 2};

, поэтому ENCODE (s) - это макрос, который должен развиваться как байтовый массив, представляющий закодированную строку (и пока я в этом, он должен добавитьзначение ограничителя строки) (здесь u8 - псевдоним неподписанного символа).

Я понятия не имею, возможно ли это с помощью препроцессора Си.Но я был бы удивлен.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Макрос не может получить доступ к отдельным символам строки.

В качестве дополнительного усложнения, если string1 должен иметь статический срок хранения (глобальный, static в функции и т. Д.), Вы даже не можете использовать строкулитерал, потому что целочисленные значения в инициализаторах должны быть выражениями целочисленных констант .

Для нестатического инициализатора вы могли бы использовать какое-то выражение, которое расширяется довложенный ? :, но он будет таким же ужасным - и его легко заменить функцией.


Вы можете использовать отдельные символы и макрос аргумента переменной.

0 голосов
/ 25 декабря 2018

Боюсь, вы не можете.Препроцессор, как следует из названия, что-то делает с файлом до фактической компиляции.Он ничего не знает о массивах, строках и т. Д.

...