C宏:将数字转换为字符串
我有一个表,它定义了5x7点显示器上的符号外观。比如: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
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;
}