この属性は、パスに達していないエラーコードを抑制するために使用することができ、関数が返さないことをコンパイラに伝えます。Cライブラリ関数アボート()とexit()は、この属性宣言を使用しています。
extern 無効の出口(int型)__attribute __((noreturn)); extern ボイドアボート(無効)__attribute __((noreturn));
一度このようにタグ付けされ、コンパイラはコードのパスを追跡し、これまでの関数呼び出しの後に戻ったことがないコントロールの流れに起因する発生しません、エラーを抑制することができます。
この例では、2つのほぼ同一Cソースファイルは決して戻らない「exitnow()」関数を参照してください、しかし__attribute__tagせずに、コンパイラは警告を発行します。それは制御が戻らないことを知る方法がないため、コンパイラは、ここに正しいです。
Test1.cに$猫 のextern ボイドexitnow(); INTのfoo(int型N) { 場合(N> 0 ) { exitnow()。 / * 制御がこのポイントに到達したことがない* / } それ以外 の戻り 0 ; } $のは、cc -c - ウォールTest1.cには Test1.cに:関数`FOOで" : Test1.cに:9:警告:この機能があり返却値の有無にかかわらず
我々は__attribute__を追加するときには、コンパイラが偽の警告を抑制します。
test2.c $猫 のextern ボイドexitnow()__attribute __((noreturn)); INTのfoo(int型N) { 場合(N> 0 ) exitnow(); それ以外 の戻り 0 ; } $のは、cc -c - ウォールtest2.cない 何の警告を!
参考:
https://blog.csdn.net/qq_26093511/article/details/53306323