【发布时间】:2017-05-06 10:00:52
【问题描述】:
我正在阅读 Brian W. Kernighan 和 Dennis M. Ritchie 的“The C programming Language”。在第 1.2 章“变量和算术表达式”中,他们演示了一个简单的华氏到摄氏转换器程序。当我编译程序(Terminal.app、macOS Sierra)时,我收到以下警告:
$ cc FtoC.c -o FtoC.o
FtoC.c:5:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main()
^
1 warning generated.
这是C程序:
FtoC.c:
1 #include <stdio.h>
2
3 /* print Fahrenheit-Celsius table
4 for fahr = 0, 20, ..., 300 */
5 main()
6 {
7 int fahr, celsius;
8 int lower, upper, step;
9
10 lower = 0; /* lower limit of temperature scale */
11 upper = 300; /* upper limit */
12 step = 20; /* step sze */
13
14 fahr = lower;
15 while (fahr <= upper) {
16 celsius = 5 * (fahr-32) / 9;
17 printf("%d\t%d\n", fahr, celsius);
18 fahr = fahr + step;
19 }
20 }
如果我对this SO answer 的理解正确,则此错误是不符合C99 标准的结果。 (?)
问题不在于编译器,而在于您的代码不遵循语法这一事实。 C99 要求提前声明所有变量和函数。函数和类定义应放在 .h 头文件中,然后包含在引用它们的 .c 源文件中。
如何使用正确的语法和标头信息编写此程序以不调用此警告消息?
对于它的价值,可执行文件输出预期的结果:
$ ./FtoC.o
0 -17
20 -6
40 4
60 15
80 26
100 37
120 48
140 60
160 71
180 82
200 93
220 104
240 115
260 126
280 137
300 148
This 很有用:
return_type function_name( parameter list ) {
body of the function
}
还有 K&R C vs C 标准的this overview,以及list of C programming books,或者,对于C language standards。
【问题讨论】:
-
使用
int main()而不仅仅是main()。 Main 还应该返回一个整数值,通常为 0(或EXIT_SUCCESS,如果包含stdlib.h)。 -
由于您传递了
-std=c99标志,我认为它实际上会尝试编译为ansi C(我认为那是c89)。这里没有c99问题。但请记住,虽然它很好,但 Kernighan & Ritchie 也很旧(我不知道是否有针对当前 C 标准和编译器的更新版本);所以有些东西会很陈旧。 -
提示:再买一本书。
-
注意:
.o扩展名通常用于目标文件。这不是您在这里创建的。只需使用cc FtoC.c -o FtoC,甚至只需cc FtoC.c并运行./a.out即可获得简单的测试程序。 -
@Mr.Kennedy 是的,它用于返回值。零表示成功,非零表示失败。
标签: c compiler-warnings kernighan-and-ritchie