下面的宏在 c 编程语言中是如何工作的?[关闭]

How below macro is working in c programming language? [closed]

提问人:sakshi monst 提问时间:11/27/2022 最后编辑:Andy A.sakshi monst 更新时间:12/2/2022 访问量:60

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

12个月前关闭。

法典:

#include <stdio.h>
#define puts "%s C preprocessor"
int main()
{
    printf(puts, puts);
    return 0;
}

输出:

%s C preprocessor C preprocessor

另请参阅...

谁能解释一下这个输出背后的逻辑?

我试图解决它,但我没有通过我的朋友得到正确的解释。如果有人能解释我,那将非常有帮助。

c 预处理器 格式说明符 using-directives

评论

2赞 Allan Wind 11/27/2022
在此处以文本形式发布代码,而不是图像的外部链接。告诉我们到目前为止您为解决您的问题做了什么。任何关于 c 的教科书都涵盖了宏。不要大喊大叫(全部大写)。
0赞 Gerhardh 11/27/2022
你能想到的最接近的解释是什么?您发现了如何用预处理器替换宏?那么缺少哪个部分来获得输出?
0赞 sakshi monst 11/29/2022
@AllanWind你不要大喊大叫
0赞 sakshi monst 11/29/2022
@Gerhardh,没有缺少任何部分。最接近的解释是 % s 将下一个参数作为字符串
2赞 Adriaan 11/29/2022
欢迎来到 Stack Overflow!请编辑您的帖子,以文本(使用代码格式)而不是图像形式添加代码和数据。图片:A) 不允许我们复制粘贴代码/错误/数据进行测试;B) 不允许根据代码/错误/数据内容进行搜索;还有更多原因。除了代码格式的文本之外,仅当图像添加了仅由文本代码/错误/数据传达的重要内容时,才应使用图像。请参阅有关所需代码的最小可重现示例

答:

0赞 Andy A. 11/29/2022 #1

宏 let to(链接器后面的代码):

int main
{
    printf("%s C preprocessor", "%s C preprocessor");
    return 0;
}

printf作品如下:

enter image description here

输出是

%s C preprocessor C preprocessor

评论

0赞 sakshi monst 11/29/2022
这种输出背后的原因是什么?
0赞 sakshi monst 11/29/2022
A,为什么会这样?为什么 IS%s 被打印出来?
0赞 Andy A. 11/29/2022
好吧,起初链接器会因为宏而更改代码。然后 printf 有 2 个相同的字符串。第一个字符串作为格式字符串,第二个字符串作为简单字符串。然后 printf 用第二个参数替换 formatstring 中的“%s”。那里的“%s”不会被替换,因为它不在格式字符串中。
0赞 Andy A. 11/29/2022
添加了 printf 中替换如何工作的图像
2赞 Andy A. 11/29/2022
现在,请用小写字母重写您的问题。写所有大写被归类为粗鲁!