C макрос: превратить число в строку
У меня есть таблица, которая определяет внешний вид символов на дисплее размером 5x7 точек. Что-то вроде:
extern UINT8 symbols[][5] = {
{0x0,0x0,0x0,0x0,0x0},
{0x0,0x0,0x5F,0x0,0x0},
{0x0,0x7,0x0,0x7,0x0},
{0x14,0x7F,0x14,0x7F,0x14}, // etc.
Ведущая часть таблицы соответствует таблице ASCII, за которой следует набор специальных символов, например стрелка или галочка. Для ссылки на них у меня есть список макросов:
#define SYMBOL_LEFT_ARROW 120 // 120 is the entry in the table
#define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW+1)
#define SYMBOL_UP_ARROW (SYMBOL_RIGHT_ARROW+1)
Теперь мне нужно сказать что-то вроде (не будет компилироваться):
const char * const message = "Next" + SYMBOL_RIGHT_ARROW;
Вопрос: Как превратить SYMBOL_RIGHT_ARROW
в "x79", или всю строку в "Nextx79"
во время компиляции , так что я могу иметь строка в разделе R / O?
Freescale HC08 C-компилятор.
3 ответа:
Вы можете объединить строки в источнике C:
printf("%s\n", "forty" "two"); /* prints "fortytwo" */ /* NOTE: ^^^ no punctuation */
Сделать это с вашими символами - это большая работа, но, возможно, вы сможете жить с этим.
#define SYMBOL_LEFT_ARROW 120 #define SYMBOL_LEFT_ARROW_STR "\x79" #define SYMBOL_RIGHT_ARROW (SYMBOL_LEFT_ARROW + 1) #define SYMBOL_RIGHT_ARROW_STR "\x83" const char * const message = "Next" SYMBOL_RIGHT_ARROW_STR;
Обновить
Если вы можете сделать так, чтобы значение символа соответствовало его положению в таблице символов (120 соответствует "\x78"), попробуйте использовать следующие макросы
#include <stdio.h> #define ADD_ZERO_X(y) 0x ## y #define SYMBOL_NUM(x) ADD_ZERO_X(x) #define STRINGIZE(z) #z #define ADD_SLASH_X(y) STRINGIZE(\x ## y) #define SYMBOL_STR(x) ADD_SLASH_X(x) #define SYMBOL_LEFT_ARROW 78 /* must write in hexadecimal without any prefix */ #define SYMBOL_RIGHT_ARROW 79 #define SYMBOL_UP_ARROW 7a int main(void) { printf("%d\n", SYMBOL_NUM(SYMBOL_LEFT_ARROW)); printf("%s\n", SYMBOL_STR(SYMBOL_LEFT_ARROW)); printf("%d\n", SYMBOL_NUM(SYMBOL_RIGHT_ARROW)); printf("%s\n", SYMBOL_STR(SYMBOL_RIGHT_ARROW)); printf("%d\n", SYMBOL_NUM(SYMBOL_UP_ARROW)); printf("%s\n", SYMBOL_STR(SYMBOL_UP_ARROW)); return 0; }
Edit (так не нравится мой браузер)
После расширения макроса
SYMBOL_NUM(32)
преобразуется в целочисленный литерал (0x78
); аSYMBOL_STR(78)
преобразуется в строковый литерал ("\x78"
).Вы можете использовать литералы, как если бы вы их ввели.
const char *test = "Next" SYMBOL_STR(78) " one"; /* same as const char *test = "Next\x78 one"; */
Я придумал такую маленькую программу:
#include <stdio.h> #define TEST_CHR '\x77' #define VAL(x) #x #define STRINGIFY(x) VAL(x) int main() { int x = TEST_CHR; char *yyy = "%d " STRINGIFY(TEST_CHR) "\n"; printf(yyy,x); return 0; }
Косвенность в макросе необходима для того, чтобы ваш символ был расширен до того, как "#" превратит его в строку. обратите внимание, что значение' \x77 ' превращается в допустимый int, когда вы используете его таким образом...