__uint128_t无法使用Clang和libstdc ++

时间:2016-12-17 12:41:46

标签: 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 ++测试程序?

1 个答案:

答案 0 :(得分:3)

在非标准-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。