[英]Construct string/char escape sequence using C macro
我想要的是C宏:CHR(0x20),它將產生字符串“ \\ x20”。
我敢肯定那是不可能的。 想證明我錯了嗎? ;-)
您可以通過生成一個較大的頭文件來做到這一點,例如使用一些Python:
for x in range(0,256):
print '#define BODGE_0x%x \\x%x' % (x,x)
然后在C中使用該輸出:
#include <stdio.h>
#include "bodge.h"
#define xstr(s) str(s)
#define str(s) #s
#define XCHR(x,y) (xstr(x##y))
#define CHR(x) xstr(BODGE_##x)
int main() {
return printf("%s\n", CHR(0x20));
}
gcc -E
可以完全滿足您的要求:
return printf("%s\n", "\x20");
如果您接受調用CHR(20)
隱含不帶0x
前綴的十六進制,則有可能(但很奇怪)做一些不那么粗略的事情。
顯而易見的解決方案是構建一個宏,擴展為:
printf("%s", "\x" "20");
使用一個間接級別很容易做到這一點,並且顯而易見的假設是,字符串的編譯時串聯將處理此問題。 不幸的是,由於轉義序列得到句柄時的轉換點,該解決方案不可行。 因此,GCC給出了錯誤:
error: \x used with no following hex digits
但是,我們可以解決該問題,並通過結合使用“預處理器”字符串化間接調用和預處理器串聯( ##
)來生成字符串“ \\ x20”:
#include <stdio.h>
#define xstr(s) str(s)
#define str(s) #s
#define XCHR(x,y) (xstr(x##y))
#define CHR(y) XCHR(\x,y)
int main() {
return printf("%s", CHR(20));
}
這確實有效,並且gcc -E顯示:
return printf("%s", ("\x20"));
這是我們希望在宏工作時看到的內容。
您也可以這樣做:
#define CHR(x) ((char[2]){(x), 0x0})
具有預期的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.