Я немного поигрался с атрибутом [[noreturn]], который я пытаюсь понять и использовать (я понимаю, [[noreturn]]
это C ++ 11 стандартный атрибут а также __attribute__((noreturn))
является расширением GCC / Clang). В рамках этого я включил предупреждение Clang -Wmissing-noreturn.
> clang++ -v
Ubuntu clang version 3.7.1-svn253742-1~exp1 (branches/release_37) (based on LLVM 3.7.1)
Target: x86_64-pc-linux-gnu
Thread model: posix
foo.cpp:
enum bar
{
A = 1,
B,
C
};
void foo()
{
switch (bar())
{
case A:
case B:
case C:
default:
break;
}
}
int main()
{
foo();
return 0;
}
Затем скомпилируйте:
> clang++ foo.cpp -o foo -Wmissing-noreturn -std=c++14
foo.cpp:9:1: warning: function 'foo' could be declared with attribute 'noreturn'
[-Wmissing-noreturn]
{
^
1 warning generated.
Мне кажется, что это вернется! Что тут происходит? Это ошибка компилятора?
Если вы удалите «= 1» из A, то он прекрасно скомпилируется без предупреждения.
Если я сделаю функцию foo () [[noreturn]] void foo()
затем происходит сбой при ошибке сегментации.
Хорошо, извините за удаление последнего ответа. Это было не правильно. Хорошо, noreturn означает, что функция никогда не заканчивается. и сегментация должна быть потому, что бар не является переменной
Других решений пока нет …