4

我在 OS X 上使用i686-apple-darwin11-llvm-gcc-4.2,我正在尝试从这个档案中编译各种程序,特别是经典的 FitCurves.c,它通过一组点拟合贝塞尔曲线。

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,从而导致错误。return从声明为返回 int 的函数在 C 中有意义吗?我在这里很困惑..

我怎样才能很好地编译这个?我不一定编译失败,但警告信息不是很丰富。它是使用旧语法编写的,我知道。

4

2 回答 2

5

您可以禁用该警告,因为您不关心它:

-Wno-implicit-int

另外,你确定你使用的是 llvm-gcc 吗?当我用你的例子进行测试时,我不得不添加-Wall让 gcc 说:

$ 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

尝试使用-ansi指定符合 1989 ANSI C 标准(相当于 1990 ISO C 标准)的选项。该旧标准允许隐式int和旧式函数定义。

C99 放弃了隐式int(但奇怪的是,C99 和 C11 仍然允许旧式函数定义)。

编译器认为它被隐式声明为返回 int 的函数,因为这正是它的本质,无论是在 ANSI C 之前还是在 1999 年之前的 ANSI/ISO c 中。

但即使使用-ansi,编译器仍可能会警告定义为返回int(显式或隐式)不返回值的函数。在 ANSI C 之前,没有void类型或关键字,并且不返回有意义值的函数通常在没有显式返回类型的情况下编写。旧的编译器不会警告这种常见的习惯用法。更现代的,相当合理地,这样做,因为有更好的方法来实现相同的结果:将函数定义void为它的返回类型。

并且对语句的抱怨return;是错误而不是警告,因为从 C99 开始,return在非void函数中没有表达式的 a 或在函数return中带有表达式的 avoid实际上是非法的(违反约束)。在 C89/C90 中,return;在非 void 函数中没有值的 a 是合法的(但如果调用者尝试使用结果,则会导致未定义的行为)。

警告消息包括用于启用它们的选项:

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

颠倒这些选项应该禁止警告。-ansi指定or也是一个好主意-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 回答