1

当我阅读libstdc++-v3/include/c/cstdio时,我对以下几行感到非常困惑:

//Get rid of those macros defined in <stdio.h> in lieu of real functions.
#undef getc
#undef gets

我认为这getc是一个宏但gets实际上是一个函数,为什么 undef 一个函数?可能在某些系统中它都是在宏中实现的?


更新: 我试着把我的理解<stdio.h><cstdio> here

<stdio.h>=
__BEGIN_NAMESPACE_STD
extern int fgetc (FILE *__stream);
extern int getc (FILE *__stream);
__END_NAMESPACE_STD
#define getc(_fp) _IO_getc (_fp)

<cstdio>=
#undef getc
  • 宏可能有一些副作用导致我们不使用,但我不能为上面的 getc(_fp) 提出这样的场合。
  • 为了安全起见,也许我们可以手动fgetc调用getc或取消宏getc
  • getc是 的弱别名IO_getc,当宏getc不生效时,函数的别名将起作用(例如,在 C++ 中隐式)。
4

1 回答 1

1

该注释清楚地暗示 in <stdio.h>、 bothgetcgets are可以是(类似函数的)宏。C 标准当然允许这样做。无论出于何种原因, C++编译器库代码都不希望将宏暴露给 C++ 程序;它希望确保调用函数。

于 2013-04-09T05:20:04.083 回答