gpt4 book ai didi

c - 宏 "#define STR(x) #x"和 "#define STR(x) VAL(x)"与 "#define VAL(x) #x"有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 16:32:40 37 4
gpt4 key购买 nike

当我使用这段代码时:

#include <stdio.h>
#define STR(x) #x

int main(void)
{
printf(__FILE__ STR(__LINE__) "hello!\n");
return 0;
}

它打印

hello.c__LINE__hello!

但是当我使用这个时:

#include <stdio.h>
#define STR(x) VAL(x)
#define VAL(x) #x

int main(void)
{
printf(__FILE__ STR(__LINE__) "hello!\n");
return 0;
}

它打印

hello.c7hello!

有什么区别

#define STR(x) #x

#define STR(x) VAL(x)
#define VAL(x) #x

最佳答案

宏的参数本身是宏扩展的,除了宏参数名称出现在带有字符串符 # 或标记粘贴符 ## 的宏主体中。

在第一种情况下,STR 的参数不是宏展开的,所以你只是得到 LINE 宏的名称。

在第二种情况下,STR 的参数宏扩展,当它被替换到 VAL 的定义中时,所以它起作用了——你得到实际的行号,因为 LINE 宏是展开。

关于c - 宏 "#define STR(x) #x"和 "#define STR(x) VAL(x)"与 "#define VAL(x) #x"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8283596/

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