【问题标题】:How to not invoke warning: type specifier missing?如何不调用警告:缺少类型说明符?
【发布时间】: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


【解决方案1】:

只要给main一个返回类型:

int main()

并确保将return 0; 添加为最后一条语句。

【讨论】:

  • 在 C99 模式下,您甚至不需要显式的 return
  • int main(){...return 0;} ?
  • @Mr.Kennedy 是的!
【解决方案2】:

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

cc -ansi FtoC.c -o FtoC.o

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

int main()

【讨论】:

  • 谢谢 - 我确实计划阅读整本书的基础知识和历史价值。
  • Plain main() 在 C90 中也无效。 C90 不允许使用空 decl-specifier 序列的声明。
  • @AnT 是的,但编译器(至少是 GCC)通常在 C90 模式下容忍它。虽然像这样编写生产代码不是一个好主意,但我认为在研究书中的示例代码时使用参数使编译器静音是可以的。
【解决方案3】:

你应该给主函数的返回类型。默认情况下,它采用int 作为其返回类型。

试试看,

int main() {
  //.....
return some_int_value;
}

【讨论】:

    【解决方案4】:

    使用 int main() 函数应该返回一个值,即 0

    int main()
    {
     //.....
    return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多