2016-09-17 2 views
2

stack overflowによれば、[[noreturn]]属性は、関数が返されないことを指定します。 OK、それは大丈夫です。C++の[[noreturn]]属性の使い方は?

しかし、私はプログラムで[[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); 
} 

C++で[[noreturn]]属性を使用する方法は?

+0

コードはそのまま使用する必要があります。http://coliru.stacked-crooked.com/a/a24777527dc295d3 C++ 14コンパイラスイッチを設定してもよろしいですか? –

+1

コンパイラが正しくありません。ここにGCCの例があります:http://coliru.stacked-crooked.com/a/e5f96e643a3672b0 –

答えて

1

準拠していないC++ 11コンパイラまたはプリ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); 
}