Our sample C program included a function printf from the standard I/O library. You can declare and define your own functions:
/* add.c * a simple C program */ #include <stdio.h> #define LAST 10 void Incr(int *num, int i); int main() { int i, sum = 0; for ( i = 1; i <= LAST; i++ ) { Incr(&sum, i); /* add i to sum */ } /*-for-*/ printf("sum = %d\n", sum); return 0; } void Incr(int *num, int i) { *num = *num + i; }Several things are going on here
The include file <stdio.h> provides a declaration, but not a definition, of printf. If this is omitted, C will make assumptions about the return type and parameter list for printf -- and these assumptions may well be wrong!
During the first compilation pass, the C compiler turns add.c into object code (machine language), making a note that it will link to printf and Incr. Linking to Incr is internal: its definition is in the same compilation unit (file) as its declaration and use. Linking to printf is implicit: the compiler links to an enormous library object (the C library) without even asking your permission. Occasionally you'll have to specify that the compiler should link to a non-standard library, such as libm.o, which has math.h as a header. This is the reason for the -l m required at the end of a compilation command that some of you saw during the problem session Wednesday afternoon.