Как к одинарной кавычке аргумент в макросе?

Я хотел бы создать макрос препроцессора C, который будет одинарная кавычка аргумент. Точно так же, как обычно используемое #X.

Я хочу Q(A) быть расширенным до 'A'.

Я использую gcc на Linux.

У кого-либо есть идея?

Я знаю # двойные кавычки. Я ищу подобный механизм для единственного заключения в кавычки.

10
задан Brian Tompsett - 汤莱恩 21 February 2016 в 11:36
поделиться

3 ответа

Лучшее, что вы можете сделать, это

#define Q(x) ((#x)[0])

или

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

#define Q(x) SINGLEQUOTED_##x

Это работает только для a-z, A-Z, 0-9 и _$ для некоторых компиляторов).

14
ответ дан 3 December 2019 в 16:29
поделиться

На самом деле, #x Дважды цитирует свой аргумент, как вы можете видеть со следующим кодом.

#define QQ(X) #X
char const * a = QQ(A);

Запустите это с GCC -E (просто увидеть вывод препроцессора), чтобы увидеть

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

char * a = "A"

для одиночного цитата вашего аргумента (который в C означает, что это один символ), используйте подписку

#define Q(X) (QQ(X)[0])
char b = Q(B);

, которые будет преобразован в

char b = ("B"[0]);
5
ответ дан 3 December 2019 в 16:29
поделиться

Лучшее я могу думать о бы

#define Q(A) (#A[0])

, но это не очень красиво, по общему признанию.

4
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: