4

私は を使用して OS X を使用しており、このアーカイブi686-apple-darwin11-llvm-gcc-4.2からさまざまなプログラムをコンパイルしようとしています。

http://tog.acm.org/resources/GraphicsGems/

一部の void または int 関数は、警告を生成する戻り値の型なしで定義されています。

ConcaveScan.c:149:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
compare_ind(u, v) int *u, *v; {return pt[*u].y <= pt[*v].y ? -1 : 1;}

これについてはよくわかりません: エラーがあります

cc -g -Wno-implicit-int -Wreturn-type   -c -o AAPolyScan.o AAPolyScan.c
AAPolyScan.c:106:4: error: non-void function 'drawPolygon' should return a value [-Wreturn-type]
return;                         /* (null polygon) */

私が理解しているように、コンパイラは int を返す関数として暗黙的に宣言されていると考えているようですが、関数は void を返し、エラーが発生します。returnint を返すように宣言された関数をC で使用することは理にかなっていますか? 私はここで混乱しています..

これをうまくコンパイルするにはどうすればよいですか?必ずしもコンパイルに失敗するわけではありませんが、警告はあまり有益ではありません。古い構文を使用して書かれており、私はそれを知っています。

4

2 に答える 2

5

気にしないので、その警告を無効にすることができます:

-Wno-implicit-int

また、llvm-gcc を使用していますか? あなたの例でテストを行ったとき、-Wallgccに次のように言わせるために追加する必要がありました:

$ gcc -Wall -c -o example.o example.c
example.c:8: warning: return type defaults to ‘int’

しかし、clang は次のように述べています。

$ clang -c -o example.o example.c
example.c:8:1: warning: type specifier missing, defaults to 'int'
      [-Wimplicit-int]
compare_ind(u, v) int *u, *v; {return pt[*u].y <= pt[*v].y ? -1 : 1;}
^~~~~~~~~~~
1 warning generated.

フラグがまったくない場合、そのメッセージは質問の警告とより厳密に一致します。私のマシンで:

$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cc --version
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix
于 2013-06-13T18:09:16.143 に答える
3

-ansi1989 ANSI C 標準 (1990 ISO C 標準と同等) への準拠を指定するオプションを使用してみてください。その古い標準では、暗黙的intで古いスタイルの関数定義が許可されていました。

C99 は暗黙的な機能を削除しましたint(ただし、奇妙なことに、C99 と C11 の両方で古いスタイルの関数定義が許可されています)。

コンパイラは、それが int を返す関数として暗黙的に宣言されていると見なします。これは、ANSI C 以前または 1999 年以前の ANSI/ISO c のいずれにおいても、まさにその通りであるためです。

ただし、 を使用しても、値を返さない (明示的または暗黙的に)-ansi返すように定義された関数についてコンパイラが警告を発する場合があります。intANSI C より前では、void型やキーワードはなく、意味のある値を返さない関数は通常、明示的な戻り値の型なしで記述されていました。古いコンパイラは、この一般的なイディオムについて警告しませんでした。同じ結果を達成するためのより良い方法があるため、より現代的なものは、非常に合理的に行いますvoid。戻り値の型として関数を定義します。

また、C99 の時点で、非関数に式がない、または関数に式があるは実際には不正 (制約違反) であるため、ステートメントに関する苦情return;は警告ではなくエラーです。C89/C90 では、非 void 関数で値を持たない は正当です (ただし、呼び出し元が結果を使用しようとすると、未定義の動作が発生します)。returnvoidreturnvoidreturn;

警告メッセージには、それらを有効にするために使用されるオプションが含まれています。

warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
...
error: non-void function 'drawPolygon' should return a value [-Wreturn-type]

これらのオプションを逆にすると、警告が抑制されます。-ansiまたは-std=c89;を指定することもお勧めします。gcc の現在のデフォルトはgnu89ですが、将来のリリースで変更される可能性があります。

cc -ansi -Wno-implicit-int -Wno-return-type ...

(これは、gcc 4.7.2 を使用した私の観察に基づいています。gcc と gcc-llvm の関係は完全にはわかりませんが、同じオプションを使用しているようです。)

于 2013-06-13T18:36:59.093 に答える