我认为该代码不应编译,但gcc(6.1及更高版本)会接受它(并在启用优化功能时在编译时计算字符串长度)。 clang ++(任何版本)都会出现我所期望的错误。
这合法吗?它是gcc特定的扩展或实现的怪癖吗?这是怎么回事?
#include <cstring>
#define STR "ab,c"
bool parse(const char *msg)
{
constexpr int len = strlen(STR);
return strlen(msg) > len;
}
g ++程序集(带有-Og)
parse(char const*):
mov eax, 0
mov rcx, -1
repnz scasb
mov rax, rcx
not rax
sub rax, 1
cmp rax, 4
seta al
ret