【问题标题】:Is getchar defined as macro? [duplicate]getchar 是否定义为宏? [复制]
【发布时间】:2018-05-11 17:02:57
【问题描述】:

我在 K&R 第 90 页读到 getchar 通常被定义为宏。

那么,为什么这段代码真的有效:

#include <stdio.h>

#undef getchar

int main()
{
    char c;
    c= getchar();
    printf("%c\n",c);

    return 0;
}

【问题讨论】:

  • 所以,显然不是。
  • 许多标准库函数定义为宏。
  • 因为getchar是一个libc函数
  • 尝试使用调试器进入getchar。您或许可以从中得到答案(即使调试器将您带入反汇编代码)。
  • @goodvibration 即使getchar 被定义为它可能被内联的函数。因此,单步调试调试器并没有告诉他任何事情。

标签: c function macros getchar kernighan-and-ritchie


【解决方案1】:

那么,为什么这段代码真的有效?

因为getchar()不仅仅是一个宏,而是一个类似函数的宏。

阅读更多How are getchar() and putchar() Macros?

【讨论】:

    【解决方案2】:

    不,C 标准将getchar() 定义为函数。请参阅C11,第 7.21.7.6 章,getchar 函数。它的原型在&lt;stdio.h&gt; 头文件中。

    任何实现,如果选择将其定义为 MACRO,则仅限于该实现。需要注意的是,这不是不符合项。来自第 7.1.4 章(强调我的

    任何功能 在头文件中声明可以额外实现为定义在 标题,

    【讨论】:

      【解决方案3】:

      宏可以巧妙地伪装成函数(在 C 中它们被称为 类函数宏),特别是如果您的预处理器支持 表达式语句

      只要getchar() 做了 C 标准规定的应该做的事情,它可以是 (i) 宏、(ii) 函数,甚至 (iii) 硬编码到编译器本身中。

      如今,getchar() 不太可能作为宏实现。

      参考:Function-like Macros

      【讨论】:

      • 来自 openbsd git hub repo 的 stdio.h 文件:#define getchar() getc(stdin)
      【解决方案4】:

      。它是一个类似于宏的函数。

      C99 7.1.4(P1):

      头文件中声明的任何函数都可以另外实现为 头文件中定义的类函数宏,因此如果在包含头文件时显式声明了库函数,则 下面显示的技术可用于确保声明不受 这样的宏。

      【讨论】:

      • 而问题是仍然重复。
      【解决方案5】:

      getchar() 不一定是宏。我不知道为什么 K&R 会这么说,但在早期这可能是事实上的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多