我正在使用 gcc 5.1.0 (c++14) 并且我正在尝试使用 constexpr。验证我实现的 constexpr 是否在编译时进行评估是非常烦人的。我找不到任何标志来获得有关这种情况的警告。
这是一个例子: 示例.cpp -----------------------------------------------------
#include <stdlib.h>
const char pruVar[] = "12345678901234567";
[[gnu::noinline]] constexpr unsigned int myStrlen(const char* cstr)
{
unsigned int i=0;
for(;cstr[i]!=0;++i);
return i;
}
struct CEXAMPLE
{
unsigned int size;
constexpr CEXAMPLE(const char* s): size(myStrlen(s))
{
}
};
int main(void)
{
CEXAMPLE c(pruVar);
unsigned int size = myStrlen(pruVar);
void* a = malloc(c.size + size);
if (a != nullptr)
return 0;
else
return 1;
}
在示例中,CEXAMPLE::CEXAMPLE 在编译时计算,包括对 myStrlen 的调用,但 main 中对 myStrlen 的调用是在运行时计算的。我知道这一点的唯一方法是查看汇编程序。这个网站也非常有用:http://gcc.godbolt.org/
如果您知道如何让编译器对此或类似的情况发出警告,我将不胜感激
最佳答案
myStrlen(pruVar)
可以在编译时求值;在这种情况下,编译器只是选择不这样做。
如果您想强制编译器在编译时计算它,或者在不可能的情况下出错,请将结果分配给 constexpr
变量:
constexpr unsigned int size = myStrlen(pruVar);
^^^^^^^^^
您还可以使用enum
或std::integral_constant
:
enum : unsigned int { size = myStrlen(pruVar) };
std::integral_constant<unsigned int, myStrlen(pruVar)> size;
关于gcc - gcc 中有一种方法可以在编译时无法评估 constexpr 时收到警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30731953/