我在第90页的K& R中读到,getchar通常被定义为宏。
那么,为什么这段代码确实有效:
#include <stdio.h>
#undef getchar
int main()
{
char c;
c= getchar();
printf("%c\n",c);
return 0;
}
答案 0 :(得分:2)
否即可。它是一个像宏一样的函数。
C99 7.1.4(P1):
标头中声明的任何函数都可以另外实现为a 类似函数的宏在头文件中定义,所以如果在包含头文件时明确声明库函数, 下面显示的技术可用于确保声明不受影响 这样的宏。
答案 1 :(得分:1)
答案 2 :(得分:1)
宏可以巧妙地伪装成函数(在C中它们被称为类函数宏),特别是如果预处理器支持表达式语句。
只要getchar()
执行C标准规定它应该做什么,它可以是(i)宏,(ii)函数,甚至(iii)硬编码到编译器本身。< / p>
现在,getchar()
不太可能作为宏实现。
答案 3 :(得分:0)
不,C标准将getchar()
定义为函数。请参阅C11
,第7.21.7.6章, getchar
函数。它是<stdio.h>
头文件中的原型。
任何实现,如果选择将其定义为MACRO,那么它仅限于该实现。值得注意的是,这不是不合格的。从章节§7.1.4(强调我的)
任何功能 在标题中声明可以另外实现作为定义在函数中的宏 标题,
答案 4 :(得分:0)
getchar()
不一定是宏。我不知道为什么K&amp; R会声称这一点,但在早些时候它可能是事实上。