Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to not invoke warning: type specifier missing?

I am reading "The C programming Language" by Brian W. Kernighan and Dennis M. Ritchie. In chapter 1.2 "Variables and Arithmetic Expressions" they demonstrate a simple Fahrenheit to Celsius converter program. When I compile the program (Terminal.app, macOS Sierra), I get this warning:

$  cc FtoC.c -o FtoC.o
FtoC.c:5:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main()
^
1 warning generated.

This is the C program:

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 }

If I understand this SO answer correctly, this error is the result of non-compliance with the C99 standard. (?)

The problem is not the compiler but the fact that your code does not follow the syntax. C99 requires that all variables and functions be declared ahead of time. Function and class definitions should be placed in a .h header file and then included in the .c source file in which they are referenced.

How would I write this program with the proper syntax and header information to not invoke this warning message?

For what it is worth, the executable file outputs the expected results:

$  ./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 was useful:

return_type function_name( parameter list ) {
   body of the function
}

Also this overview of K&R C vs C standards, and a list of C programming books, or, for the C language standards.

like image 330
MmmHmm Avatar asked May 06 '17 10:05

MmmHmm


2 Answers

Just give main a return type:

int main()

and make sure to add return 0; as the last statement.

like image 57
Mureinik Avatar answered Oct 16 '22 12:10

Mureinik


You can either tell the compiler to use the C language standard C90 (ANSI), which was modern when the book was written. Do it by using parameter -std=c90 or -ansi to the compiler, like this:

cc -ansi FtoC.c -o FtoC.o

or you can rewrite the program to adhere to a newer standard (C99), which is what your compiler uses by default, by adding a return type to the main function, like this:

int main()
like image 4
Honza Remeš Avatar answered Oct 16 '22 11:10

Honza Remeš