Clang-cl.exe和constexpr深度

时间:2016-12-07 06:24:36

标签: c++ clang llvm constexpr

我在使用Visual Studio 2015时使用了Clang 3.6,并且我使用这个CRC32实现在编译时生成哈希:

#define CRC32(message) (crc32_<sizeof(message) - 2>(message) ^ 0xFFFFFFFF)

static constexpr uint32_t crc_table[256] = {
  0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
  0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
  ...
};

template<size_t idx>
constexpr uint32_t crc32_(const char * str)
{
  return (crc32_<idx - 1>(str) >> 8) ^ crc_table[(crc32_<idx - 1>(str) ^ str[idx]) & 0x000000FF];
}

#pragma warning(push)
#pragma warning(disable : 4100)

// This is the stop-recursion function
template<>
constexpr uint32_t crc32_<size_t(-1)>(const char * str)
{
  return 0xFFFFFFFF;
}

问题是,当我使用大于18个字符的字符串时,clang-cl.exe会抱怨:

constexpr evaluation hit maximum step limit; possible infinite loop?

我已经看到了关于设置-fconstexpr-depth-fconstexpr-steps的一些答案。我尝试使用clang-cl.exe的参数-Xclang -fconstexpr-steps=10将这些选项传回给Clang,但我得到了:

unknown argument: '-fconstexpr-steps=10'

有趣的是,我直接使用clang.exe测试该选项并识别它。

我的问题是:有没有办法用clang-cl.exe设置constexpr步骤或constexpr深度?

1 个答案:

答案 0 :(得分:1)

使用for /f "delims=" %%v in ('dir /s /b /a-d 2^>nul') do if "%time:~9,2%"=="77" echo process "%%v"

具有gcc样式的clang将-Xclang -fconstexpr-steps -Xclang 10转换为-fconstexpr-steps=10,这是两个单独的参数。

要转换-fconstexpr-steps 10中两个单独的参数,您应在其前面加上clang-cl两次