如何不调用警告:缺少类型说明符?

Mr.*_*edy 4 c kernighan-and-ritchie compiler-warnings

我正在阅读Brian W. Kernighan和Dennis M. Ritchie的" C编程语言 ".在第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.
Run Code Online (Sandbox Code Playgroud)

这是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 }
Run Code Online (Sandbox Code Playgroud)

如果我理解正确答案,则此错误是不符合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
Run Code Online (Sandbox Code Playgroud)

很有用:

return_type function_name( parameter list ) {
   body of the function
}
Run Code Online (Sandbox Code Playgroud)

此外,还概述了K&R C与C标准,以及C编程书籍清单,或C语言标准.

Mur*_*nik 9

只需给出main一个返回类型:

int main()
Run Code Online (Sandbox Code Playgroud)

并确保添加return 0;为最后一个语句.

  • 在C99模式下,您甚至不需要显式的`return`. (2认同)

Hon*_*meš 5

您可以告诉编译器使用 C 语言标准 C90 (ANSI),该标准在本书撰写时是现代的。-std=c90通过使用参数或-ansi编译器来完成此操作,如下所示:

cc -ansi FtoC.c -o FtoC.o
Run Code Online (Sandbox Code Playgroud)

或者您可以通过向函数添加返回类型来重写程序以遵循较新的标准 (C99),这是您的编译器默认使用的标准main,如下所示:

int main()
Run Code Online (Sandbox Code Playgroud)