如何在宏中单引号参数?

问题描述 投票:0回答:6

我想创建一个 C 预处理器宏,它将单引号引用参数。就像常用的

#X

我希望将

Q(A)
扩展到
'A'

我在 Linux 上使用 gcc。

有人有想法吗?

我知道

#
双引号。我正在寻找类似的单引号机制。

gcc c-preprocessor stringification
6个回答
18
投票

你能做的最好的就是

#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
_
(以及某些编译器的
$
)。


7
投票

实际上,

#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]);

4
投票

我能想到的最好的就是

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

但不可否认,这不是很漂亮。


1
投票

这会产生转化:

#python
for i in range(ord('a'), ord('n')):
    print "#define BOOST_PP_CHAR_%s '%s'" % (chr(i), chr(i))

这是预处理器部分:

#ifndef BOOST_PP_CHAR_HPP
#define BOOST_PP_CHAR_HPP

#define BOOST_PP_CHAR(c) BOOST_PP_CHAR_ ## c
//  individual declarations    

#endif // BOOST_PP_CHAR_HPP

1
投票

我刚刚尝试过串联:

#define APOS           '
#define CHAR2(a,b,c)   a##b##c
#define CHAR1(a,b,c)   CHAR2(a,b,c)
#define CHAR(x)        CHAR1(APOS,x,APOS)

不幸的是,预处理器抱怨未终止的字符。 (如果您有多个字符,则为多字符) 一种禁用预处理器错误的方法:(没有具体的警告选项)

-no-integrated-cpp -Xpreprocessor -w

一些编译时优化示例以及其他一些技巧:

#define id1_id       HELP
#define id2_id       OKAY

#define LIST(item,...) \
    item(id1, ##__VA_ARGS__)\
    item(id2, ##__VA_ARGS__)\
    item(id1, ##__VA_ARGS__)\

#define CODE(id,id2,...)    ((CHAR(id##_id) == CHAR(id2##_id)) ? 1 : 0) +
int main() { printf("%d\n", LIST(CODE,id1) 0); return 0; }

这将返回“2”,因为有两个项目具有 id1。


0
投票

在任何地方都找不到解决方案并摆弄宏后,我找到了解决方案。

#define QUOTE_LITERAL() '
// yes you need the () with QUOTE_LITERAL
#define IN_QUOTES(x) QUOTE_LITERAL()x'

您会收到警告,但可以使用

-no-integrated-cpp -Xpreprocessor -w
消除它们。正如@darkfader 所提到的

© www.soinside.com 2019 - 2024. All rights reserved.