gpt4 book ai didi

c - 在引用的字符串中扩展宏变量

转载 作者:太空狗 更新时间:2023-10-29 16:46:17 24 4
gpt4 key购买 nike

我在两本著名的 c 书籍中发现了两个不同的东西,第一个是“在宏扩展中,形式参数不会在带引号的字符串中被替换”- K&R c 语言第 76 页

第二个是代码,

#define PRINT(var,format) printf("variable is %format\n",var)
PRINT(x_var,f);

以后的宏调用将展开为

printf("x_var is %f\n",x_var);
  • 这是通过在第 448 页的 ansi c - E. balagurusamy 中编程实现的。

肯定有两个引文相互矛盾。据我所知,第一个是真的,我的编译器给我的结果也是如此。但第二本书也广为人知和流行。我想知道以前版本的c中是否有这样的东西,或者第二次引用是错误的。

最佳答案

第二本书错了:it is easy to check宏不会像那样扩展。但是,您可以使用 # 预处理器运算符通过 stringizing 标记获得它们描述的效果:

#define PRINT(var,format) printf(#var" is %"#format"\n",var)

现在您可以按如下方式打印您的变量:

int xyz = 123;
PRINT(xyz, d);

这里是 a link to a working sample on ideone .

请注意在“#format”前后添加了双引号,在“var”和“format”之前添加了“#”。 '#' 运算符使变量的值变成带引号的字符串——带有自己的双引号。这使得被替换的字符串成为连续四个带引号的字符串,C 编译器将其识别为连接成一个字符串的请求。因此字符串:“xyz”、“is %”、“d”和“\n”被连接成:“xyz is %d\n”

(请注意,此示例与原始问题中的示例不同,因为原始示例具有“变量是...”,其中答案将“变量”替换为“var”宏参数的实例)

关于c - 在引用的字符串中扩展宏变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11232146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com