2016-09-17 1 views
2

Согласно stack overflow, атрибут [[noreturn]] указывает, что функция не возвращается. Хорошо, все в порядке.Как использовать атрибут [[noreturn]] в C++?

Но я не понимаю, как использовать атрибут [[noreturn]] в программе. Я попытался использовать атрибут [[noreturn]] в своем коде. Но когда я скомпилировал свой код в компиляторе GCC, я получил следующую ошибку.

error: expected unqualified-id before ‘[’ token 
[[noreturn]] void f(int i) { 
^ 
cp1.cpp: In function ‘int main()’: 
cp1.cpp:11:6: error: ‘f’ was not declared in this scope 
    f(10); 

Мой код здесь:

#include <cstdlib> 

[[noreturn]] void f(int i) { 
    if (i > 0) 
    throw "Received positive input"; 
    std::exit(0); 
} 

int main() 
{ 
     f(10); 
} 

Как использовать [[noreturn]] атрибут в C++?

+0

Ваш код должен работать как есть: http://coliru.stacked-crooked.com/a/a24777527dc295d3. Вы уверены, что вы установили переключатель компилятора C++ 14? –

+1

Неправильный компилятор. Вот пример GCC: http://coliru.stacked-crooked.com/a/e5f96e643a3672b0 –

ответ

1

Вы определенно используете несоответствующий компилятор C++ 11 или компилятор pre-C++ 11, или ваши флаги не установлены на -std=c++11? (как минимум).

Если вы застряли с предварительно C++ 11 компиляторов, вы можете обернуть простой макрос, который использует встроенный компилятор атрибутов в надеюсь, переносимым способом:

#ifdef __GNUC__ 
#define NO_RETURN __attribute__((noreturn)) 
#elif __MINGW32__ 
#define NO_RETURN __attribute__((noreturn)) 
#elif __clang__ 
#define NO_RETURN __attribute__((noreturn)) 
#elif _MSC_VER 
#define NO_RETURN __declspec(noreturn) 
#endif 

, а затем использовать как:

NO_RETURN void f(int i) { 
    if (i > 0) 
    throw "Received positive input"; 
    std::exit(0); 
}