__gnu_linux__ 代表什么?

bjh*_*end 1 c++ linux gcc preprocessor gnu

背景

我们有一些旧的 C++ 代码,其中包含只有在__gnu_linux__定义预处理器符号时才编译的部分。在我的 Ubuntu 20.04 和 GCC 9.3 上编译不是问题。现在,我们尝试将其移植到基于 Alpine Linux 和 GCC 10.2 的 Docker 容器,并发现在__gnu_linux__这种情况下未定义。

因此,我搜索了有关__gnu_linux__预处理器宏的任何文档,但在 GCC 或其预处理器 CPP 的文档中找不到任何内容。我能找到的唯一提示是以下预定义符号列表,但它没有提到任何文档:https : //sourceforge.net/p/predef/wiki/OperatingSystems/

问题

  • 我在哪里可以找到有关__gnu_linux__预处理器宏的任何官方文档?
  • GCC在什么条件下定义它?

研究至今

通过在 中进行全文搜索,/usr我获得了一些点击。一个是 Boost 头文件也查询该宏,另外两个是二进制文件cc1cc1plus. 我发现那些是分别为 C 和 C++ 实现预处理器的 GCC 的内部工具,但我找不到这些的任何官方文档。所以,我克隆了 GCC 源代码库,发现它__gnu_linux__在更改日志中只提到了一次,并且包含一些特殊的提交,用 更改了一行__gnu_linux__,但没有一个对它做出明确的声明。

Nat*_*dge 6

gcc/config/linux.h

#define GNU_USER_TARGET_OS_CPP_BUILTINS()                       \
    do {                                                        \
        if (OPTION_GLIBC)                                       \
          builtin_define ("__gnu_linux__");                     \
Run Code Online (Sandbox Code Playgroud)

所以它只在使用 glibc 的 Linux 系统上定义。但是Alpine 使用 musl libc 代替

提交中也提到:

( LINUX_TARGET_OS_CPP_BUILTINS):__gnu_linux__只为 GLIBC定义。