[英]C macro : turn a number into a string
我有一個表格,用於在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)
現在我需要說一些(不會編譯):
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;
如果您可以使符號的值與符號表中的位置匹配(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;
}
編輯(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 <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;
}
宏中的間接是必要的,以便在“#”將其轉換為字符串之前擴展您的角色。 請注意,當您以這種方式使用時,'\\ x77'值將變為有效的int ...
這是我能想到的最好的,不完美,但可以放在ROM中:
const char message[] = {'N','e','x','t',SYMBOL_RIGHT_ARROW,EOS};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.