Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 如何在宏中引用参数?_Gcc_C Preprocessor_Stringification - Fatal编程技术网

Gcc 如何在宏中引用参数?

Gcc 如何在宏中引用参数?,gcc,c-preprocessor,stringification,Gcc,C Preprocessor,Stringification,我想创建一个C预处理器宏,它将单引号引用参数。就像常用的#X一样 我想把Q(A)扩展到'A' 我在Linux上使用gcc 有人有主意吗 我知道双引号。我正在寻找一种类似的单一报价机制。我能想到的最好办法是 #define Q(A) (#A[0]) 但是,无可否认,这并不十分漂亮。你所能做的就是 #define Q(x) ((#x)[0]) 或 这只适用于a-z,a-z,0-9和(和$对于某些编译器)。实际上,\X双引号引用了它的参数,正如您在下面的代码中看到的那样 #define QQ(X)

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

我想把
Q(A)
扩展到
'A'

我在Linux上使用gcc

有人有主意吗


我知道双引号。我正在寻找一种类似的单一报价机制。

我能想到的最好办法是

#define Q(A) (#A[0])
但是,无可否认,这并不十分漂亮。

你所能做的就是

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

这只适用于
a
-
z
a
-
z
0
-
9
(和
$
对于某些编译器)。

实际上,
\X
双引号引用了它的参数,正如您在下面的代码中看到的那样

#define QQ(X) #X
char const * a = QQ(A);
使用
gcc-E
(只需查看预处理器输出)运行此命令即可查看

将转化为

char b = ("B"[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)
但不幸的是,预处理器会抱怨未终止字符。(如果有多个字符,则为多字符) 一种仅禁用预处理器错误的方法:(没有特定的警告选项)

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

#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。

噢,第二个方法是纯粹的邪恶;-)<根据C标准,代码>$不是标识符的有效字符。我想某些特定的编译器可能会接受它。@Dale:是的,GCC支持将
$
作为标识符。戴尔:嗯,该标准允许实现定义的字符超过数字、ASCII字母和下划线。但这可能不是很便于携带,那么:)
#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; }