无法在C ++标准库头文件中找到未定义的宏

时间:2017-11-28 22:39:12

标签: c++ c macros c++-standard-library

我知道对于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

1 个答案:

答案 0 :(得分:1)

请注意,您描述的所有内容都特定于您正在观察的特定库实现,并不适用于所有编译器的所有C或C ++库。

取消定义未定义的宏无效。为了独立于所使用的C库,C ++标头可以取消定义所有标准符号以防

例如,在独立环境(无操作系统)中,不可能使用标准GNU C,因为它具有操作系统和POSIX依赖性。在这种情况下,可以使用替代的C库,例如Newlib。但是GNU C ++库只依赖于标准C库,因此可以与替代C库一起使用,它们可以定义为宏。