4

考虑以下用于 GNU 扩展的类型特征的小型测试程序__uint128_t

#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++(工作示例)以及 clang++ 和 libc++(工作示例),但不适用于 clang++ 和 libstdc++(失败示例)的组合。

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

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

4

1 回答 1

6

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

于 2016-12-17T13:07:56.073 回答