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

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

我知道对于 C 标准库中的每个 <header.h>,C++ 都有一个 头文件,例如

每个 都将包含其对应的 <header.h> 并取消定义与标准库函数对应的大量宏列表,例如:

/*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 没有这些宏的踪迹,只有正常的函数原型(prototype)。在 /usr/include 处使用 grep 进行递归搜索显示它们未定义,仅在 文件中未定义。我错过了什么?

我的 gcc 版本是 5.4.0,我使用的是与 Windows 10 捆绑在一起的 Ubuntu 16.04.3 LTS

最佳答案

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

取消定义未定义的宏没有任何效果。为了独立于所使用的 C 库,C++ 头文件可以取消所有标准符号的定义,以防不是因为它们被定义为宏。

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

关于c++ - 无法找到 C++ 标准库头文件中未定义的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47542129/

相关文章:

c++ - char 类型与 char[9] 类型的不兼容赋值

c++ - 具有所有私有(private)成员的类可以是 POD 类吗?

c++ - 枚举窗口?

c - 在 1 个循环中存储 char n 次

java - 编程语言中的 char-int 等效项

rust - 有没有办法将参数与 Rust 宏相匹配?

c++ - 即使有守卫也会出现关于重新定义的错误

c - 在 C 中返回字符串指针

c - 在C中获取标签的地址

c - 如何在编译时在 gcc 中显示 #define 的值