Tuesday 8 November 2011

When should I declare a function? in C programming

When should I declare a function?

 Functions that are used only in the current source file should be declared as static (see FAQ VIII.4), and the function’s declaration should appear in the current source file along with the definition of the function. Functions used outside of the current source file should have their declarations put in a header file, which can be included in whatever source file is going to use that function. For instance, if a function named stat_func() is used only in the
source file stat.c, it should be declared as shown here:
/* stat.c */
#include <stdio.h>
static int stat_func(int, int); /* static declaration of stat_func() */
åvoid main(void);
void main(void)
{
...
rc = stat_func(1, 2);
...
}
/* definition (body) of stat_func() */
static int stat_func(int arg1, int arg2)
{
...
return rc;
}
In this example, the function named stat_func() is never used outside of the source file stat.c. There is
therefore no reason for the prototype (or declaration) of the function to be visible outside of the stat.c source
file. Thus, to avoid any confusion with other functions that might have the same name, the declaration of
stat_func() should be put in the same source file as the declaration of stat_func().

In the following example, the function glob_func() is declared and used in the source file global.c and is used
in the source file extern.c. Because glob_func() is used outside of the source file in which it’s declared, the
declaration of glob_func() should be put in a header file (in this example, named proto.h) to be included
in both the global.c and the extern.c source files. This is how it’s done:

File: proto.h
/* proto.h */
int glob_func(int, int); /* declaration of the glob_func() function */
File: global.c
/* global.c */
#include <stdio.h>
#include “proto.h” /* include this file for the declaration of
glob_func() */
void main(void);
void main(void)
{
...
rc = glob_func(1, 2);
...
}
/* definition (body) of the glob_func() function */
int glob_func(int arg1, int arg2)
{
...
return rc;
}
File: extern.c
/* extern.c */
#include <stdio.h>
#include “proto.h” /* include this file for the declaration of
glob_func() */
void ext_func(void);
void ext_func(void)
{
...
/* call glob_func(), which is defined in the global.c source file */
rc = glob_func(10, 20);
...
}

In the preceding example, the declaration of glob_func() is put in the header file named proto.h because
glob_func() is used in both the global.c and the extern.c source files. Now, whenever glob_func() is going
to be used, you simply need to include the proto.h header file, and you will automatically have the function’s
declaration. This will help your compiler when it is checking parameters and return values from global
functions you are using in your programs. Notice that your function declarations should always appear before
the first function declaration in your source file.

In general, if you think your function might be of some use outside of the current source file, you should
put its declaration in a header file so that other modules can access it. Otherwise, if you are sure your function
will never be used outside of the current source file, you should declare the function as static and include
the declaration only in the current source file.

Cross Reference:

VIII.2: Why should I prototype a function?
VIII.3: How many parameters should a function have?
VIII.4: What is a static function?

No comments:

Post a Comment