gpt4 book ai didi

c - 宏中的宏不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:25 25 4
gpt4 key购买 nike

我又遇到了一段更令人困惑的代码..

#include "stdio.h"

#define f(a,b) a##b

#define g(a) #a

#define h(a) g(a)

int main(void)
{
printf("%s\n",h(f(1,2)));
printf("%s\n",g(1));
printf("%s\n",g(f(1,2)));
return 0;
}

输出是

12

1

f(1,2)

我的假设是1) 首先 f(1,2) 被替换为 12 ,因为宏 f(a,b)连接它的参数2) 然后 g(a) 宏将 1 替换为字符串文字 "1"3) 输出应该是1

但为什么 g(f(1,2)) 没有被替换为 12。我确定我在这里遗漏了一些东西。谁能给我解释一下这个程序?

最佳答案

宏替换是从外向内进行的。(严格来说,预处理器的行为需要像一次替换一个宏一样,从文件的开头开始,每次替换后重新启动。)

标准(C99 §6.10.3.2/2)说

If, in the replacement list, a parameter is immediately preceded by a # preprocessing token, both are replaced by a single character string literal preprocessing token that contains the spelling of the preprocessing token sequence for the corresponding argument.

由于 # 出现在宏 g替换列表中,参数 f(1,2) 立即转换为字符串,结果为"f(1,2)"

另一方面,在 h(f(1,2)) 中,由于替换列表不包含 #,因此适用 §6.10.3.1/1 ,

After the arguments for the invocation of a function-like macro have been identified, argument substitution takes place. A parameter in the replacement list, unless preceded by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is replaced by the corresponding argument after all macros contained therein have been expanded.

并且参数 f(1, 2) 被宏扩展为 12,所以结果是 g(12) 然后当文件被“重新扫描”时变为 “12”

关于c - 宏中的宏不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23662615/

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