C macro:将数字转换为字符串

我有一个表格,用于在5×7点显示屏上定义符号外观。 就像是:

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”,或将整个字符串转换为"Next\x79" AT COMPILE TIME,以便我可以在R / O部分中输入字符串?

飞思卡尔HC08 C编译器。

您可以在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; 

UPDATE

如果您可以使符号的值与符号表中的位置匹配(120匹配“\ x78”),请尝试这些宏

 #include  #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; } 

编辑(SO不喜欢我的浏览器)

宏扩展后, 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  #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 …

这是我能想到的最好的,不完美,但可以放在ROM中:

 const char message[] = {'N','e','x','t',SYMBOL_RIGHT_ARROW,EOS};