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

C宏:将数字转换为字符串,c,c-preprocessor,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. 表格的前导部分与ASCII表格匹配,后跟一组特殊符号,例如箭头或复选标记。要引用这些宏,我有一个宏列表: #define SYMBOL_L

我有一个表,它定义了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)
现在我需要说(不会编译):

问题:如何在编译时将
符号向右箭头
转换为“\x79”,或将整个字符串转换为
“下一个\x79”
,以便在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;
更新 如果可以使符号的值与其在符号表中的位置相匹配(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;
}

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

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

我想出了一个小计划:

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

}
#包括
#定义测试\u CHR'\x77'
#定义VAL(x)#x
#定义STRINGIFY(x)VAL(x)
int main()
{
int x=测试_CHR;
char*yyy=“%d”字符串化(测试\u CHR)”\n;
printf(yyy,x);
返回0;
}

宏中的间接寻址是必要的,这样在“#”将字符转换为字符串之前,您的字符就会展开。请注意,“\x77”值以这种方式使用时会变成有效的int…

我会尽量避免任何运行时字符串生成:1)额外的周期;2) 我想在ROM中保留常量字符串(这是一个嵌入式系统)。如何从
中生成
'\x77'
;定义我的\u符号0x77
?#我的\u符号将生成“\x77”而不是“\x77”。我认为在int表达式中,'\x77'将取代0x77?(因此在main中赋值为“x”)。另外,我认为:char my_literal[]={“Next”STRINGIFY(TEST_CHR)};//应该是浪漫的。。。
const char message[] = {'N','e','x','t',SYMBOL_RIGHT_ARROW,EOS};
#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;

}