【问题标题】:Why does gcc -ansi remove the declarations of cosf and the like?为什么 gcc -ansi 去掉 cosf 之类的声明?
【发布时间】:2011-01-03 11:18:47
【问题描述】:

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

是的,我#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 中删除声明?

【问题讨论】:

    标签: c gcc c99 c89


    【解决方案1】:

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

    【讨论】:

    • 嗯,它们似乎已被删除,因为它们实际上并不存在。 -Wall -Wextra -ansi -pedantic 是我在学校的编译标志,我相当确定我们使用了 sinf() 等。我得去看看。谢谢!一旦允许我就接受答案。
    【解决方案2】:

    不要将-ansi 用于现代代码。尽管当前版本的 ANSI C 与 ISO9899-1999 (C99) 保持一致,-ansi 已被 gcc 永久指定为“传统模式”。如果您正在编译 C99 代码,只需使用 -std=c99。这是现代的等价物。

    【讨论】:

    • 并且一定要扇你遇到的任何 GCC 维护者的耳光,因为他们严重滥用了 ansi 这个词。
    • 并给他们额外的一些耳光,让他们在默认预处理器选项中保留-Dlinux=1-Dunix=1,破坏任何使用具有这些名称的符号的符合程序,除非您使用-ansi 或@987654328 @ 选项删除它们。
    猜你喜欢
    • 2012-02-01
    • 2011-02-01
    • 2012-01-22
    • 1970-01-01
    • 2012-04-19
    • 2021-11-03
    • 1970-01-01
    • 2020-05-12
    • 2020-08-16
    相关资源
    最近更新 更多