我想创建一个将单引号参数的C预处理器宏。就像常用的一样#X
。
我想Q(A)
扩大到'A'
.
我在 Linux 上使用 gcc。
有人有想法吗?
我知道#
双引号。我正在寻找一种类似的单引号机制。
我想创建一个将单引号参数的C预处理器宏。就像常用的一样#X
。
我想Q(A)
扩大到'A'
.
我在 Linux 上使用 gcc。
有人有想法吗?
我知道#
双引号。我正在寻找一种类似的单引号机制。
你能做的最好的就是
#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
和_
(以及$
某些编译器)。
实际上,#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]);
我能想到的最好的就是
#define Q(A) (#A[0])
但这不是很漂亮,诚然。
这会产生转化:
#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
我刚刚尝试过连接:
#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。