如何在宏中引用参数?

eya*_*alm 10 gcc stringification c-preprocessor

我想创建一个C预处理器宏,它将引用该参数.就像常用的一样#X.

我想Q(A)扩大到'A'.

我在Linux上使用gcc.

有人有想法吗?

我知道#双引号.我正在寻找一种类似的单引号机制.

ken*_*ytm 14

你能做的最好的就是

#define Q(x) ((#x)[0])
Run Code Online (Sandbox Code Playgroud)

要么

#define SINGLEQUOTED_A 'A'
#define SINGLEQUOTED_B 'B'
...
#define SINGLEQUOTED_z 'z'

#define Q(x) SINGLEQUOTED_##x
Run Code Online (Sandbox Code Playgroud)

这仅适用于a- z,A- Z,0- 9_(以及$某些编译器).


ram*_*ion 5

实际上,#X双引用其参数,正如您可以使用以下代码看到的那样.

#define QQ(X) #X
char const * a = QQ(A);
Run Code Online (Sandbox Code Playgroud)

运行此命令gcc -E(仅查看​​预处理器输出)以查看

# 1 "temp.c"
# 1 "<built-n>"
# 1 "<command line>"
# 1 "temp.c"

char * a = "A"
Run Code Online (Sandbox Code Playgroud)

单引号你的参数(在C中表示它是单个字符)使用下标

#define Q(X) (QQ(X)[0])
char b = Q(B);
Run Code Online (Sandbox Code Playgroud)

这将转化为

char b = ("B"[0]);
Run Code Online (Sandbox Code Playgroud)