我仍在尝试找出C中的宏:
#define A(x) #x
int main()
{
int i = -i;
char *s = A(i);
i = -(s[0] == 'i');
printf("%d", i);
return 0;
}
任何人都希望启发我并注释代码,尤其是宏的功能以及以下内容:
i = -(s[0] == 'i');
最佳答案
阅读有关C preprocessor的更多信息,尤其是stringification
因此,将A(i)
扩展为"i"
文字字符串(并且A(strange !?)
将在"strange !?"
中扩展,假设strange
不是某些#define
-d预处理器宏)。因此s[0]
为'i'
,(s[0] == 'i')
为true,表示为1,因此输出为-1 ...
您应该已经使用所有警告和调试信息(gcc -Wall -Wextra -g
)编译了代码。然后逐步在调试器(gdb
)中运行您的程序。
还要注意,int i = -i;
是(由Cool Guy注释)undefined behavior;您真的应该担心UB,因为它可以be horrible(即使在我的x86_64 / Linux机器上-使用我通常的编译器-在这种特殊的int i= -i;
情况下,它可能也不会造成很大的危害,只是一点点)。
您还可以在某些编辑器或分页器中观看使用gcc -Wall -C -E
获得的预处理形式。
顺便说一句,您的代码示例缺少#include <stdio.h>
PS。我建议您在笔记本电脑上安装Linux,并在命令行上学习使用Linux(及其编译器)。研究现有的free software代码,您可以找到使用C预处理器进行字符串化的良好示例。
关于c - C中的宏问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34961598/