__gnu_linux__代表什么?
背景
我们有一些旧的 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 头文件也查询该宏,另外两个是二进制文件cc1和cc1plus. 我发现那些是分别为 C 和 C++ 实现预处理器的 GCC 的内部工具,但我找不到这些的任何官方文档。所以,我克隆了 GCC 源代码库,发现它__gnu_linux__在更改日志中只提到了一次,并且包含一些特殊的提交,用 更改了一行__gnu_linux__,但没有一个对它做出明确的声明。
回答
见gcc/config/linux.h:
#define GNU_USER_TARGET_OS_CPP_BUILTINS()
do {
if (OPTION_GLIBC)
builtin_define ("__gnu_linux__");
所以它只在使用 glibc 的 Linux 系统上定义。但是Alpine 使用 musl libc 代替。
在提交中也提到:
(
LINUX_TARGET_OS_CPP_BUILTINS):__gnu_linux__只为 GLIBC定义。