gpt4 book ai didi

c - 为什么 gcc -ansi 去掉 cosf 之类的声明?

转载 作者:太空狗 更新时间:2023-10-29 15:53:30 25 4
gpt4 key购买 nike

您可能认为我完全疯了并且不擅长编程。其中之一可能是这种情况,但请阅读我的发现。

是的,我 #include <math.h>

Full Code can be found here. (我试图让它符合 ansi 标准,让它在 VS2010 上编译,它是通过一个关于混合代码和声明的错误,以及 fminf() 丢失。令我惊讶的是 VS2010 关心混合代码和具有默认警告级别的声明。我记忆 2008 年不关心,但可能是错误的。)

这是使用 c89/-ansi 标准时的 gcc 输出。注意函数的隐式声明。还有一些关于未使用参数的其他信息,但我们暂时不关心这些。 (签名需要用 GLUT 注册回调)

当我使用 c89 或 ansi 标准运行应用程序时,它会产生错误的输出,就像数学函数没有按预期运行一样。

$ STANDARD=-std=c89 make -f Makefile.Unix
gcc -std=c89 -Wextra -Wall -pedantic -c -o file-util.o file-util.c -I/usr/X11R6/include
gcc -std=c89 -Wextra -Wall -pedantic -c -o gl-util.o gl-util.c -I/usr/X11R6/include
gcc -std=c89 -Wextra -Wall -pedantic -c -o meshes.o meshes.c -I/usr/X11R6/include
In file included from meshes.c:12:
vec-util.h: In function ‘vec_length’:
vec-util.h:10: warning: implicit declaration of function ‘sqrtf’
meshes.c: In function ‘calculate_flag_vertex’:
meshes.c:48: warning: implicit declaration of function ‘sinf’
meshes.c:50: warning: implicit declaration of function ‘cosf’
gcc -std=c89 -Wextra -Wall -pedantic -c -o flag.o flag.c -I/usr/X11R6/include
In file included from flag.c:18:
vec-util.h: In function ‘vec_length’:
vec-util.h:10: warning: implicit declaration of function ‘sqrtf’
flag.c: In function ‘update_p_matrix’:
flag.c:58: warning: implicit declaration of function ‘fminf’
flag.c: In function ‘mouse’:
flag.c:252: warning: unused parameter ‘x’
flag.c:252: warning: unused parameter ‘y’
flag.c: In function ‘keyboard’:
flag.c:261: warning: unused parameter ‘x’
flag.c:261: warning: unused parameter ‘y’
flag.c: At top level:
vec-util.h:1: warning: ‘vec_cross’ defined but not used
vec-util.h:13: warning: ‘vec_normalize’ defined but not used
gcc -o flag file-util.o gl-util.o meshes.o flag.o -L/usr/X11R6/lib -lGL -lglut -lGLEW

现在使用 c99 标准,函数消息的隐式声明消失了。

$ STANDARD=-std=c99 make -f Makefile.Unix
gcc -std=c99 -Wextra -Wall -pedantic -c -o file-util.o file-util.c -I/usr/X11R6/include
gcc -std=c99 -Wextra -Wall -pedantic -c -o gl-util.o gl-util.c -I/usr/X11R6/include
gcc -std=c99 -Wextra -Wall -pedantic -c -o meshes.o meshes.c -I/usr/X11R6/include
gcc -std=c99 -Wextra -Wall -pedantic -c -o flag.o flag.c -I/usr/X11R6/include
flag.c: In function ‘mouse’:
flag.c:252: warning: unused parameter ‘x’
flag.c:252: warning: unused parameter ‘y’
flag.c: In function ‘keyboard’:
flag.c:261: warning: unused parameter ‘x’
flag.c:261: warning: unused parameter ‘y’
flag.c: At top level:
vec-util.h:1: warning: ‘vec_cross’ defined but not used
vec-util.h:13: warning: ‘vec_normalize’ defined but not used
gcc -o flag file-util.o gl-util.o meshes.o flag.o -L/usr/X11R6/lib -lGL -lglut -lGLEW

当使用 c99 标准时,程序的行为符合预期。

问题

为什么使用 -ansi 标志似乎会从 math.h 中删除声明?

最佳答案

如果您检查 GCC Builtins documentation ,您会看到 C99 标准中引入了 sinfcosf 函数(以及更多相关函数)。

关于c - 为什么 gcc -ansi 去掉 cosf 之类的声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4583987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com