__gnu_linux__ 代表什么?
What does __gnu_linux__ stand for?
背景
我们有一些旧的 C++ 代码,其中包含只有在定义了预处理器符号 __gnu_linux__
时才会编译的部分。使用 GCC 9.3 在我的 Ubuntu 20.04 上编译不是问题。现在,我们试图将其移植到基于 Alpine Linux 和 GCC 10.2 的 Docker 容器,并发现在这种情况下未定义 __gnu_linux__
。
因此,我搜索了有关 __gnu_linux__
预处理器宏的任何文档,但在 GCC 或其预处理器 CPP 的文档中找不到任何内容。我能找到的唯一提示是以下预定义符号列表,但它没有提及任何文档:https://sourceforge.net/p/predef/wiki/OperatingSystems/
问题
- 在哪里可以找到关于
__gnu_linux__
预处理器宏的官方文档?
- GCC 在什么条件下定义它?
目前研究
通过在 /usr
中进行全文搜索,我得到了一些结果。一个是 Boost 头文件,也查询该宏,另外两个是二进制文件 cc1
和 cc1plus
。我发现这些是 GCC 的内部工具,分别为 C 和 C++ 实现预处理器,但我找不到这些的任何官方文档。所以,我克隆了 GCC 源代码库,发现它在更改日志中只提到了一次 __gnu_linux__
,并且包含一些特殊的提交,用 __gnu_linux__
更改了一行,但是其中的 none对此作出明确声明。
#define GNU_USER_TARGET_OS_CPP_BUILTINS() \
do { \
if (OPTION_GLIBC) \
builtin_define ("__gnu_linux__"); \
因此它仅在使用 glibc 的 Linux 系统上定义。但是Alpine uses musl libc instead.
在the commit中也提到:
(LINUX_TARGET_OS_CPP_BUILTINS
): Define __gnu_linux__
only for GLIBC.
背景
我们有一些旧的 C++ 代码,其中包含只有在定义了预处理器符号 __gnu_linux__
时才会编译的部分。使用 GCC 9.3 在我的 Ubuntu 20.04 上编译不是问题。现在,我们试图将其移植到基于 Alpine Linux 和 GCC 10.2 的 Docker 容器,并发现在这种情况下未定义 __gnu_linux__
。
因此,我搜索了有关 __gnu_linux__
预处理器宏的任何文档,但在 GCC 或其预处理器 CPP 的文档中找不到任何内容。我能找到的唯一提示是以下预定义符号列表,但它没有提及任何文档:https://sourceforge.net/p/predef/wiki/OperatingSystems/
问题
- 在哪里可以找到关于
__gnu_linux__
预处理器宏的官方文档? - GCC 在什么条件下定义它?
目前研究
通过在 /usr
中进行全文搜索,我得到了一些结果。一个是 Boost 头文件,也查询该宏,另外两个是二进制文件 cc1
和 cc1plus
。我发现这些是 GCC 的内部工具,分别为 C 和 C++ 实现预处理器,但我找不到这些的任何官方文档。所以,我克隆了 GCC 源代码库,发现它在更改日志中只提到了一次 __gnu_linux__
,并且包含一些特殊的提交,用 __gnu_linux__
更改了一行,但是其中的 none对此作出明确声明。
#define GNU_USER_TARGET_OS_CPP_BUILTINS() \
do { \
if (OPTION_GLIBC) \
builtin_define ("__gnu_linux__"); \
因此它仅在使用 glibc 的 Linux 系统上定义。但是Alpine uses musl libc instead.
在the commit中也提到:
(
LINUX_TARGET_OS_CPP_BUILTINS
): Define__gnu_linux__
only for GLIBC.