我知道对于C标准库中的每个< header.h> ,C ++都有一个< cheader> 头文件,例如: < stdio.h> 和< cstdio> 。
每个&lt; cheader&gt; 将包含其对应的&lt; header.h&gt; 并取消定义与标准库函数对应的大量宏列表,例如:< / p>
/*sample taken from cstdlib*/
// Get rid of those macros defined in <stdlib.h> in lieu of real functions.
#undef abort
#undef abs
#undef atexit
/* ... */
并将相应的函数传递给std命名空间:
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
using ::div_t;
using ::ldiv_t;
using ::abort;
using ::abs;
using ::atexit;
/* ... */
}
查看stdlib.h没有这些宏的痕迹,只有正常的函数原型。在 / usr / include 处使用grep执行递归搜索,向我显示它们未定义,仅在&lt; cheader&gt; 文件中未定义。我错过了什么?
我的gcc版本是5.4.0,我在Ubuntu 16.04.3 LTS中捆绑了Windows 10
答案 0 :(得分:1)
请注意,您描述的所有内容都特定于您正在观察的特定库实现,并不适用于所有编译器的所有C或C ++库。
取消定义未定义的宏无效。为了独立于所使用的C库,C ++标头可以取消定义所有标准符号以防
例如,在独立环境(无操作系统)中,不可能使用标准GNU C,因为它具有操作系统和POSIX依赖性。在这种情况下,可以使用替代的C库,例如Newlib。但是GNU C ++库只依赖于标准C库,因此可以与替代C库一起使用,它们可以定义为宏。