C macro : turn a number into a string
c, c-preprocessor
Solution
You can concatenate strings in C source:
printf("%s\n", "forty" "two"); /* prints "fortytwo" */
/* NOTE: ^^^ no punctuation */
To do that with your symbols is a lot of work, but maybe you can live with that.
#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;
UPDATE
If you can make the value of the symbol match its position in the symbol table (120 match "\x78"), try these macros
#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 (SO doesn't like my browser)
After macro expansion `SYMBOL_NUM(32)` is transformed to a integer literal (`0x78`); and `SYMBOL_STR(78)` is transformed to a string literal (`"\x78"`).
You can use the literals as if you had typed them in.
const char *test = "Next" SYMBOL_STR(78) " one";
/* same as
const char *test = "Next\x78 one";
*/
Problem
I have a table that defines symbols appearance on a 5x7 dot display. Something like: ``` 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. ``` The leading part of the table matches ASCII table, followed by a set of special symbols, e.g. an arrow, or a check-mark. To reference those I have a list of macros: ``` #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) ``` Now I need to say something like (won't compile): ``` const char * const message = "Next" + SYMBOL_RIGHT_ARROW; ``` Question: How do I turn `SYMBOL_RIGHT_ARROW` into "\x79", or whole string into `"Next\x79"` AT COMPILE TIME so I can have the string in R/O section? Freescale HC08 C-compiler.