gcc -ansi为什么要删除cosf等的声明?

问题描述 投票:3回答:2

您可能认为我在编程上完全疯了,而且非常糟糕。可能是其中一种,但请阅读我的发现。

是,我#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
2个回答
8
投票

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


3
投票

请勿将C99用于现代代码。尽管ANSI C的当前版本已与ISO9899-1999(C99)保持一致,但[g]已由gcc永久指定为“传统模式”。如果要编译C99代码,只需使用-ansi。这是现代的等效项。

© www.soinside.com 2019 - 2024. All rights reserved.