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

THX*_*138 6 c c-preprocessor

我有一个表格,用于在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.
Run Code Online (Sandbox Code Playgroud)

该表的前导部分与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)
Run Code Online (Sandbox Code Playgroud)

现在我需要说一些(不会编译):

const char * const message = "Next" + SYMBOL_RIGHT_ARROW;
Run Code Online (Sandbox Code Playgroud)

问题:如何将SYMBOL_RIGHT_ARROW"\ x79"或整个字符串转换为"Next\x79" AT COMPILE TIME,以便我可以在R/O部分中输入字符串?

飞思卡尔HC08 C编译器.

pmg*_*pmg 13

您可以在C源中连接字符串:

printf("%s\n", "forty" "two"); /* prints "fortytwo" */
/* NOTE:             ^^^ no punctuation */
Run Code Online (Sandbox Code Playgroud)

用你的符号做这件事是很多工作,但也许你可以忍受.

#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;
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果您可以使符号的值与符号表中的位置匹配(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;
}
Run Code Online (Sandbox Code Playgroud)

编辑(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";
*/
Run Code Online (Sandbox Code Playgroud)