__attribute __((noreturn))の使用

 

この属性は、パスに達していないエラーコードを抑制するために使用することができ、関数が返さないことをコンパイラに伝えます。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

 

 

おすすめ

転載: www.cnblogs.com/sea-stream/p/11233641.html