template<unsigned int LINE> class Unreachable_At_Line {};
#define __builtin_unreachable() throw Unreachable_At_Line<__LINE__>()
Редактировать :
Поскольку вы хотите, чтобы компилятор пропускал недоступный код, ниже приведен самый простой способ.
#define __builtin_unreachable() { struct X {X& operator=(const X&); } x; x=x; }
Оптимизатор компиляторапрочь x = x;
инструкция, особенно когда она недоступна.Вот пример использования:
int foo (int i)
{
switch(i)
{
case 0: return 0;
case 1: return 1;
default: return -1;
}
__builtin_unreachable(); // never executed; so compiler optimizes away
}
Если вы поставите __builtin_unreachable()
в начале foo()
, то компилятор сгенерирует ошибку компоновщика для невыполненных operator =
.Я выполнил эти тесты в gcc 3.4.6 (64-bit).