9

以下の C プログラムをコンパイルすると、次の警告が表示されます ‘noreturn’ function does return。これは機能です:

void hello(void){
  int i;
  i=1;
 }

なぜそれが起こっているのでしょうか?この関数へのすべての呼び出しはhello();

編集:完全なエラー出力:

 home.c: In function ‘hello’:
 hhme.c:838:7: error: variable ‘i’ set but not used [-Werror=unused-but-set-variable]
 home.c:840:1: error: ‘noreturn’ function does return [-Werror]
 cc1: all warnings being treated as errors
 make: *** [home.o] Error 1
4

2 に答える 2

29

gcc特定の関数が決して戻らないと言うことができます。これにより、特定の最適化が可能になり、初期化されていない変数の誤った警告を回避するのに役立ちます。

これは、noreturn属性を使用して行われます。

void func() __attribute__ ((noreturn));

属性にもかかわらず関数が返される場合noreturn、コンパイラは表示されている警告を発します (この場合はエラーに変換されます)。

コードで使用する可能性は低いため、次の例のように、noreturn名前が標準関数と衝突する関数があると考えられます。noreturn

#include <stdlib.h>

void exit(int) {
}                // warning: 'noreturn' function does return [enabled by default]

ここで、私のexit衝突はexit(3).

そのような衝突のもう 1 つの明らかな候補はabort(3).

もちろん、関数が実際に呼び出されhello()た場合、原因はほぼ確実にコード ベース内のどこかにあります。

于 2013-04-12T06:13:25.423 に答える
4

ほとんどの場合、関数は でマークされてい__attribute__((noreturn))ます。ただし、実際には戻ります (制御が irs 本体の最後に到達すると、無限ループに入らないため、他の "noreturn" 関数などを呼び出しません)。

1.関数を返さないものとしてマークする、2.何もしない関数を書く-おそらく両方を排除することができますか?

于 2013-04-12T06:15:25.610 に答える