【发布时间】:2021-12-10 06:19:15
【问题描述】:
我有一个 consteval crc32 函数,它在编译时工作得很好。我希望这个函数在另一个常量内联函数中使用。
下面是一个代码示例,便于理解:
unsigned int consteval strsum(const std::string str) {
auto n = 0;
for (int i = 0; i < str.size(); i++) n += str.at(i);
return n;
}
void _printHash(const unsigned int hash) {
printf("%d", hash);
}
__forceinline void printHash(const std::string str) {
_printHash(strsum(str));
}
int main(int argc, char* argv[]) {
printHash("abc");
}
我希望这段代码编译为:
int main(int argc, char* argv[]) {
_printHash(/* hash constant */);
}
相反,我收到 C7595 错误:对 consteval 函数的调用不是常量表达式。
有没有办法在 MSVC 上实现想要的行为?
【问题讨论】:
-
你试过
__force_inline关键字吗? -
@Mechap 刚刚试过。没有改变任何东西。
-
编译这段代码时你使用了哪些编译器选项?
-
@Mechap 默认值:
/JMC /permissive- /ifcOutput "Debug\" /GS /analyze- /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl /Fd"Debug\vc142.pdb" /Zc:inline /fp:precise /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /std:c++20 /FC /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\TestConsole.pch" /diagnostics:column -
你的例子不是minimal reproducible example。如果不出意外,
crc_table是一个未声明的标识符。显示任何人都可以复制、粘贴到他们的编译器中并重现问题的代码。
标签: c++ visual-c++ constants constexpr consteval