簡體   English   中英

使用C宏構造字符串/字符轉義序列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM