【问题标题】:Issues with macros in CC 中的宏问题
【发布时间】:2016-01-23 09:02:59
【问题描述】:

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


【解决方案1】:

详细了解C preprocessor,尤其是stringification

所以 A(i) 扩展为 "i" 文字字符串(并且 A(strange !?) 将扩展为 "strange !?" ,假设 strange 不是某个 #define-d 预处理器宏)。因此s[0]'i'(s[0] == 'i')为真,表示为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,并学习在命令行上使用它(及其编译器)。研究现有的free software 代码,您可以找到使用 C 预处理器进行字符串化的好例子。

【讨论】:

  • 谢谢你这解释了事情。我在 Windows 上使用 Codeblocks,所以我对编译器能做的事情有所限制。
  • 代码块正在运行编译器命令。因此,只需找出它正在运行的命令,然后自己在终端中运行该命令。然后,调整该命令以提供更多警告,并显示预处理器输出
  • @ranpos,那你为什么不转向 linux。我以前在 Windows 上工作,在 Virtual Box 上安装了几个月的 linux,最后现在在 Ubuntu 笔记本电脑上工作(另外,您可以在计算机上安装两个操作系统)。
  • 编译时的输出是-1。因为比较 [0] == 'i' 是正确的,所以它输出 1,加上符号: i = -(s[0] == 'i');没有?
  • @ranpos BTW,你在这里做什么:int i = -i;??这会调用未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2011-01-02
  • 2015-05-29
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多