getchar是否定义为宏?

getchar是否定义为宏?,c,function,macros,getchar,kernighan-and-ritchie,C,Function,Macros,Getchar,Kernighan And Ritchie,我在《K&R》第90页读到,getchar通常被定义为宏 那么,为什么这段代码实际上可以工作: #include <stdio.h> #undef getchar int main() { char c; c= getchar(); printf("%c\n",c); return 0; } #包括 #未定义getchar int main() { 字符c; c=getchar(); printf(“%c\n”,c); 返回0; } 那么,为

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

那么,为什么这段代码实际上可以工作:

#include <stdio.h>

#undef getchar

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

    return 0;
}
#包括
#未定义getchar
int main()
{
字符c;
c=getchar();
printf(“%c\n”,c);
返回0;
}
那么,为什么这段代码真的有效呢

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

阅读更多

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

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


请阅读

不,C标准将
getchar()
定义为一个函数。参见
C11
,第7.21.7.6章,
getchar
函数。它是在
头文件中原型化的

任何实现,如果选择将其定义为宏,则仅限于该实现。需要指出的是,这不是不符合项。第§7.1.4章(重点)

任何功能 在头文件中声明的还可以作为类似于中定义的宏的函数来实现 头球


不,C标准将
getchar()
定义为一个函数。参见
C11
,第7.21.7.6章,
getchar
函数。它是在
头文件中原型化的

任何实现,如果选择将其定义为宏,则仅限于该实现。需要指出的是,这不是不符合项。第§7.1.4章(重点)

任何功能 在头文件中声明的还可以作为类似于中定义的宏的函数来实现 头球


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

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

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


参考:。

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

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

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


参考文献:.

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

C99 7.1.4(P1):

头中声明的任何函数都可以作为 函数类似于标头中定义的宏,因此如果在包含标头时显式声明库函数,则 下面所示的技术之一可以用来确保声明不受 这样一个宏


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

C99 7.1.4(P1):

头中声明的任何函数都可以作为 函数类似于标头中定义的宏,因此如果在包含标头时显式声明库函数,则 下面所示的技术之一可以用来确保声明不受 这样一个宏


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

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

所以,显然不是。许多标准库函数也被定义为宏。因为getchar是一个libc函数,所以请尝试使用调试器进入
getchar
。您可能可以从中得到答案(即使调试器将您带入反汇编代码)。@goodvibration即使
getchar
被定义为一个函数,它也可能被内联。因此,单步执行调试器并没有告诉他任何事情。因此,显然不是。许多标准库函数也被定义为宏。因为getchar是一个libc函数,请尝试使用调试器单步执行
getchar
。您可能可以从中得到答案(即使调试器将您带入反汇编代码)。@goodvibration即使
getchar
被定义为一个函数,它也可能被内联。因此,通过调试器并没有告诉他任何事情。问题仍然是重复的。问题仍然是重复的。来自openbsd git hub repo的stdio.h文件:#来自openbsd git hub repo的stdio.h文件的define getchar()getc(stdin):#来自openbsd git hub repo的stdio.h文件的define getchar()getc(stdin)