我仍在尝试找出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/

10-11 23:05