getchar被定义为宏吗?

时间:2017-11-28 09:37:50

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

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

那么,为什么这段代码确实有效:

#include <stdio.h>

#undef getchar

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

    return 0;
}

5 个答案:

答案 0 :(得分:2)

即可。它是一个像宏一样的函数。

C99 7.1.4(P1):

  

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

答案 1 :(得分:1)

  

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

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

How are getchar() and putchar() Macros?

中了解详情

答案 2 :(得分:1)

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

只要getchar()执行C标准规定它应该做什么,它可以是(i)宏,(ii)函数,甚至(iii)硬编码到编译器本身。< / p>

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

参考:Function-like Macros

答案 3 :(得分:0)

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

任何实现,如果选择将其定义为MACRO,那么它仅限于该实现。值得注意的是,这不是不合格的。从章节§7.1.4(强调我的

  

任何功能   在标题中声明可以另外实现作为定义在函数中的宏   标题,

答案 4 :(得分:0)

getchar()不一定是宏。我不知道为什么K&amp; R会声称这一点,但在早些时候它可能是事实上