C语言中连接两个字符串的宏

发布于 2024-08-19 18:31:13 字数 291 浏览 5 评论 0原文

我正在尝试定义一个宏,该宏假定采用 2 个字符串值并返回它们,它们之间用一个空格连接起来。看来我可以使用除空格之外的任何字符,例如:

#define conc(str1,str2) #str1 ## #str2 
#define space_conc(str1,str2) conc(str1,-) ## #str2

space_conc(idan,oop);

space_conc 将返回“idan-oop”

我想要返回“idan oop”,有建议吗?

I'm trying to define a macro which is suppose to take 2 string values and return them concatenated with a one space between them. It seems I can use any character I want besides space, for example:

#define conc(str1,str2) #str1 ## #str2 
#define space_conc(str1,str2) conc(str1,-) ## #str2

space_conc(idan,oop);

space_conc would return "idan-oop"

I want something to return "idan oop", suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

起风了 2024-08-26 18:31:13

试试

#define space_conc(str1,str2) #str1 " " #str2

这个 '##' 用于连接符号,而不是字符串。在 C 中,字符串可以简单地并置,编译器将连接它们,这就是这个宏的作用。首先将 str1 和 str2 转换为字符串(如果您像这样使用它 space_conc(hello, world) ,那么我们可以说“hello”和“world”),然后使用简单的单字符将它们彼此相邻放置空格,中间的字符串。也就是说,编译器将像这样解释生成的扩展,

"hello" " " "world"

并将其连接到

"hello world"

HTH

Edit
为了完整起见,宏扩展中的“##”运算符是这样使用的,假设您

#define dumb_macro(a,b) a ## b

将得到以下结果,如果调用为 dumb_macro(hello, world)

helloworld

它不是一个字符串,而是一个符号,您可能会遇到未定义符号错误,表示“helloworld”不存在,除非您先定义它。这是合法的:

int helloworld;
dumb_macro(hello, world) = 3;
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'

Try this

#define space_conc(str1,str2) #str1 " " #str2

The '##' is used to concatenate symbols, not strings. Strings can simply be juxtaposed in C, and the compiler will concatenate them, which is what this macro does. First turns str1 and str2 into strings (let's say "hello" and "world" if you use it like this space_conc(hello, world)) and places them next to each other with the simple, single-space, string inbetween. That is, the resulting expansion would be interpreted by the compiler like this

"hello" " " "world"

which it'll concatenate to

"hello world"

HTH

Edit
For completeness, the '##' operator in macro expansion is used like this, let's say you have

#define dumb_macro(a,b) a ## b

will result in the following if called as dumb_macro(hello, world)

helloworld

which is not a string, but a symbol and you'll probably end up with an undefined symbol error saying 'helloworld' doesn't exist unless you define it first. This would be legal:

int helloworld;
dumb_macro(hello, world) = 3;
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'
秋叶绚丽 2024-08-26 18:31:13
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
痴梦一场 2024-08-26 18:31:13

正确的做法是将 2 根琴弦并排放置。 “##”不起作用。只是:

#define concatenatedstring string1 string2

The right was to do it is to place the 2 strings one next to the other. '##' won't work. Just:

#define concatenatedstring string1 string2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文