比较来自世界各地的卖家的域名和 IT 服务价格

C/C++ Contentation Macrotter.

#define STR1 "s"
#define STR2 "1"
#define STR3 STR1 ## STR2


是否有可能连接 STR3 == "s1"?
你可以通过传递来做 args 另一种宏功能。 但是有直接路径吗?
已邀请:

八刀丁二

赞同来自:

如果他们都是字符串,你可以做到:


#define STR3 STR1 STR2


预处理器自动组合相邻线。

EDIT

:

如下所述,级联不执行预处理器,而是编译器。

冰洋

赞同来自:

您不需要为字符串文字解决此解决方案,因为它们在语言级别组合,它仍然不起作用,因为 "s""1" 它不是预处理器的允许令牌。

[Edit: 回答错误的评论 "Just for the record" 下面,这是不幸的,收到了几个上诉,我重复上述声明并注意到该计划的片段


#define PPCAT_NX/A, B/ A ## B
PPCAT_NX/"s", "1"/


从预处理阶段确保此错误消息 gcc:

error: 插入 ""s"" 和" "1"" 没有给出一个允许的令牌

印前人
]

但是,为了整体插入令牌,尝试执行以下操作:


/*
* Concatenate preprocessor tokens A and B without expanding macro definitions
* /however, if invoked from a macro, macro arguments are expanded/.
*/
#define PPCAT_NX/A, B/ A ## B

/*
* Concatenate preprocessor tokens A and B after macro-expanding them.
*/
#define PPCAT/A, B/ PPCAT_NX/A, B/


然后,例如,和
PPCAT_NX/s, 1/

, 和
PPCAT/s, 1/

生成标识符
s1

, 要是
s

没有定义为宏,在这种情况下
PPCAT/s, 1/

生产
<macro of="" s="" value="">1

.

继续这个话题是否有这些问题 macros:


/*
* Turn A into a string literal without expanding macro definitions
* /however, if invoked from a macro, macro arguments are expanded/.
*/
#define STRINGIZE_NX/A/ #A

/*
* Turn A into a string literal after macro-expanding it.
*/
#define STRINGIZE/A/ STRINGIZE_NX/A/


然后,


#define T1 s
#define T2 1
STRINGIZE/PPCAT/T1, T2// // produces "s1"


相比之下,


STRINGIZE/PPCAT_NX/T1, T2// // produces "T1T2"
STRINGIZE_NX/PPCAT_NX/T1, T2// // produces "PPCAT_NX/T1, T2/"

#define T1T2 visit the zoo
STRINGIZE/PPCAT_NX/T1, T2// // produces "visit the zoo"
STRINGIZE_NX/PPCAT/T1, T2// // produces "PPCAT/T1, T2/"


</macro>

小明明

赞同来自:

提示:宏
STRINGIZE

上面很酷,但如果你犯了错误,它的论点不是宏 - 你的名字或你忘记了拼写错误
#include

在头文件中 - 编译器很乐意将估计的宏名称放在字符串中没有错误。

如果你认为这个论点
STRINGIZE

始终是具有正常含义的宏 C, 那


#define STRINGIZE/A/ //A/,STRINGIZE_NX/A//


部署一次并检查有效性,将其抛出,然后返回到字符串。

我需要一些时间来理解原因
STRINGIZE/ENOENT/

结果是
"ENOENT"

反而
"2"

..., 我没有开启
errno.h

.

要回复问题请先登录注册