【问题标题】:__uint128_t not working with Clang and libstdc++__uint128_t 不适用于 Clang 和 libstdc++
【发布时间】:2023-03-03 04:14:01
【问题描述】:

考虑以下用于__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++测试程序?

【问题讨论】:

  • 这不是关于标准 C++,而是关于 GNUC++。 GCC 在-std=c++1z 模式下的静态断言也失败了。从标准的角度来看,GCC 定义这种类型的方式意味着它不是整数类型,只是一种恰好像整数类型一样工作的自定义类型,并且在符合标准的模式下,类型特征反映了这一点。 (我不确定 clang/libc++ 是如何定义它的。它可能在它们的实现中符合整数类型。)
  • @hvd 请注意,在所有 3 个示例中,我都使用了-std=gnu++1z,并且只有在 clang + libstdc++ 的情况下才会失败
  • 我知道,我发表评论是为了澄清,而不是驳回您的问题。 :)
  • 对于 Apple 平台上的 std::numeric_limits&lt;uint128_t&gt;,请参阅 Apple Clang and numeric_limits<unsigned __int128>::max() is 0?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-11-26
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多