2
void init(void) 
{
   glClearColor ((float)0.0, (float)0.0, (float)0.0, (float)0.0);
   glShadeModel (GL_FLAT);
}

のパラメータglClearColorは float です。しかし、gcc は常に警告を発します。

main.c: In function ‘init’:
main.c:12: warning: passing argument 1 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
main.c:12: warning: passing argument 2 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
main.c:12: warning: passing argument 3 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
main.c:12: warning: passing argument 4 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype 

しかし、数字を double ではなく float に変換するだけで、理由がわかりません。

私のOSはmac os 64bitで、以下はmakefile.

UNAME := $(shell uname)

ifeq ($(UNAME), Darwin)
    CFLAG := -framework GLUT -framework OpenGL -g -Wall -Wconversion
else
    CFLAG := -lm -lglut -lGL -lGLU -g -Wall
endif

PUB_SRC := util.c plane.c dot.c linked_dots.c controller.c time_data.c
SRC := main.c $(PUB_SRC)
TEST_SRC := test.c $(PUB_SRC)

.PHONY : main
main: $(SRC)
    gcc $(CFLAG) $(SRC)

.PHONY : test
test: $(TEST_SRC)
    gcc $(CFLAG) $(TEST_SRC)
4

3 に答える 3

3

GCC 3.x を使用していると思いますか? GCC 3.x では、-Wconversionフラグは次のように文書化されています。

プロトタイプが、プロトタイプがない場合に同じ引数に起こるものとは異なる型変換を引き起こす場合に警告します。これには、固定小数点から浮動小数点への変換、およびその逆の変換、および固定小数点引数の幅または符号を変更する変換が含まれます。ただし、デフォルトの昇格と同じ場合を除きます。

また、負の整数定数式が暗黙的に符号なし型に変換された場合に警告します。たとえば、 が署名されていないx = -1場合、代入について警告します。xただし、 のような明示的なキャストについて警告しないでください(unsigned) -1

リンク

私の理解では、このフラグの本来の目的は、従来の C から ANSI C に移行する際の潜在的な問題と、プロトタイプの追加が問題を引き起こす可能性があるケースを検出することでした。(正直なところ、関数を使用するよりも、プロトタイプ自体が警告をトリガーする方が意味があったように思えますが、おそらく私が見逃している使用法がいくつかあります。)

于 2012-11-25T05:09:37.913 に答える
1

Appleが提供するGCCを使用して、

i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

このコード:

extern void glClearColor(float, float, float, float);
enum { GL_FLAT = 0 };
extern void glShadeModel(int);
extern void init(void);

void init(void) 
{
   glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
   glClearColor(0.0, 0.0, 0.0, 0.0);
   glClearColor((float)0.0, (float)0.0, (float)0.0, (float)0.0);
   glShadeModel(GL_FLAT);
}

警告付きでコンパイルします:

/usr/bin/gcc -O3 -g -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Wconversion -c xx.c
xx.c: In function ‘init’:
xx.c:8: warning: passing argument 1 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:8: warning: passing argument 2 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:8: warning: passing argument 3 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:8: warning: passing argument 4 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:9: warning: passing argument 1 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:9: warning: passing argument 2 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:9: warning: passing argument 3 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:9: warning: passing argument 4 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:10: warning: passing argument 1 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:10: warning: passing argument 2 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:10: warning: passing argument 3 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype
xx.c:10: warning: passing argument 4 of ‘glClearColor’ as ‘float’ rather than ‘double’ due to prototype

GCC 4.7.1を使用し-Wconversionてコンパイルした場合、またはを使用せずにコンパイルした場合は、正常にコンパイルされます。

を編集して警告makefileを削除する-Wconversionか、警告を無視して対処する必要があります。2つの間に、私はドロップし-Wconversionます。

于 2012-11-25T05:16:38.803 に答える
1

10 進数リテラルを入力した場合は、double を宣言しています。glClearColor はフロートを使用します。double は潜在的に長い数値であり、より多くの情報を含めることができるため、float にキャストすると情報が失われる可能性があるため、警告が表示されます。数値の後に af を追加することで、float が必要であることを指定できます。

于 2012-11-25T05:12:36.417 に答える