c++ - __uint128_t 不适用于 Clang 和 libstdc++

标签 c++ g++ clang++ libstdc++ int128

考虑以下针对 __uint128_t

的 GNU 扩展的类型特征的小测试程序
#include <limits>
#include <type_traits>

using uint128_t = __uint128_t;

int main()
{
    static_assert(std::is_unsigned<uint128_t>{}, ""); 
    static_assert(std::is_integral<uint128_t>{}, "");
    static_assert(std::numeric_limits<uint128_t>::digits == 128, "");
}

这适用于 g++ 和 libstdc++ ( working example ) 以及 clang++ 和 libc++ ( working example ),但不适用于 clang++ 和 libstdc++ 的组合 ( failing example )。

请注意,在所有 3 种情况下,我都使用了 -std=gnu++1z 标志。

问题:哪种命令行参数组合可以使用 libstdc++ 成功编译我的 clang++ 测试程序?

最佳答案

在非标准的 -std=gnu++* 模式下,GCC 预定义了两个宏,libstdc++ 使用它们来提供额外的类型特征:

$ g++ -std=gnu++1z -c -E -dM -xc++ /dev/null | grep INT_N
#define __GLIBCXX_BITSIZE_INT_N_0 128
#define __GLIBCXX_TYPE_INT_N_0 __int128

clang 没有定义这些。通过在命令行上传递 -D__GLIBCXX_TYPE_INT_N_0=__int128-D__GLIBCXX_BITSIZE_INT_N_0=128 手动定义它们,使您的测试用例可以使用 clang。

在 clang 本身中添加这些是 https://llvm.org/bugs/show_bug.cgi?id=23156 ,标记为已修复,但我不确定在哪个版本中。我在本地安装了 3.8.1,但它不起作用,但我没有检查 3.9.0。

关于c++ - __uint128_t 不适用于 Clang 和 libstdc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41198673/

相关文章:

c++ - 使用 GCC-4.8.1 在 MinGW 上编译 wxWidgets-2.8.12 时出错

c++ - 无法执行已编译的 C++ exe 文件

c++ - g++ 无法将 .o 文件链接到可执行文件

c++ - 了解在共享库中重载 operator new 的行为

c++ - 如何让叮当警告非常简单的缩小

c++ - 编程访问Windows网络共享文件夹

c++ - boost::container::string 的内存是否连续?

c++ - 将 C++ 字节数组转换为 C 字符串

c++ - 如何计算文本文件中特定单词的出现次数

c++ - G++ 7.1.0 及更高版本支持此构造函数中的保证复制省略,但 Clang++ 4.0 及更高版本不支持